文档章节

小菜学设计模式——状态模式

learn_more
 learn_more
发布于 2015/06/14 11:33
字数 943
阅读 149
收藏 9

背景

    就算你重复做一件事情几十年,这件事情也未必每次都和上一次一样那么干净的结束。因为,状态会影响的你,不同的状态,所做出的事情自然也不一样。库里状态手感火热的时候,可以展示变态准;状态低迷时,直接被James吊打。


1、使用意图

    把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。


2、生活实例

    作为一名实实在在的码农,打代码这个状态模式是一个不错的例子。打代码可根据时间变化有不同的状态。


3、Java 例子(框架、JDK 、JEE)

    暂时未发现,如有同学发现,请及时补充


4、模式类图

图片引用自:http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html

1、抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为。

2、具体状态(ConcreteState)角色:每一个具体状态类都实现了环境的一个状态所对的行为。

3、场景(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象现有的状态。


5、模式优点

    状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

    状态模式:允许一个对象在其内部状改变时改变它的行为。看起来就像是改变了它的类一样。(不同的翻译)

    主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。

    把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。

    当一个对象的行为取决于它的状态,并且他必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。

    状态模式通过各种状态转移逻辑分布到State子类之间,来减少相互间的依赖。

    将特定的状态相关行为都放入一个对象中,由于所有状态相关代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。


6、与类似模式比较

    这个模式貌似与策略模式有点相似,类图基本相同,也可以这样理解在不同的状态下采用不同的策略应对。不过策略模式注重的是针对一个问题所所应对的不同方法;然而,状态模式是比策略模式稍微复杂的模式,状态模式是不同状态下的应对处理;

    另外,状态模式中,因为状态时刻发生变化都可能需要修改context内部,所以,具体状态之间也会有依赖关系,比如 上班打代码这个状态,中午状态如果运行完成,那么中午状态的具体实现有必要把context的状态修改为下午状态,下午状态同样有义务修改为context的状态为傍晚状态,就这样状态与context其实都是相互依赖的,具体状态直接也是有依赖关系的。



© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 92
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
0
0
小菜学设计模式——设计模式总结之创建型

1、面向过程与面向对象 1)面向过程通过划分功能模块,通过函数间相互调用来实现,但需求变化时就需要更改函数,而你改动的函数有多少地方在调用她呢?关联多少数据,这是很不容易弄得清楚地...

learn_more
2015/07/05
0
0
小菜学设计模式——设计模式总结之结构型

1、设计模式总结 设计模式总共23个,但是常用的不到10个,下面就把这23个设计模式进行整理归类,具体如下: 1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型...

learn_more
2015/07/06
0
0
状态与策略——审批操作的两种方案

审批操作是ERP或OA系统中必不可少的功能之一。这里介绍两种我设计的用于审批操作的方案,并借此就“状态模式”与“策略模式”提出一点自己的理解。 别问我为什么不使用工作流引擎等工具来实现...

winters1224
06/26
0
0
小菜学设计模式——工厂方法模式

背景 简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类,对于客户端来说,去除了与具体产品的依赖。如果,项目需要扩展,新增一种产品需要简...

learn_more
2015/06/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL 索引 explain索引分析优化

EXPLAIN是MySQL提供的工具,可用于模拟优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的,包括表的读取顺序、数据读取操作的操作类型、可能使用的索引、实际使用的索引、表之间的引...

PeakFang-BOK
19分钟前
1
0
17-《深度拆解JVM》之即时编译(上)

一、问题引入 在第一篇中,我们简单了解过即时编译。这是一项用来提升应用程序运行效率的技术。通常而言,代码会先被 Java 虚拟机解释执行,之后反复执行的热点代码则会被即时编译成为机器码...

飞鱼说编程
19分钟前
1
0
OSChina 周二乱弹 —— 请上车吧

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @2amor :分享王菲的单曲《闷》 《闷》- 王菲 手机党少年们想听歌,请使劲儿戳(这里) @開源中國周杰倫 :昨天睡觉肚子疼,妈蛋,半夜爬起来...

小小编辑
今天
745
11
工作中如何做好技术积累

参考:https://tech.meituan.com/study_vs_work.html 看了这篇文章,觉得总结得非常好,因此摘抄了一些关键点,以便自己经常翻阅。 引言 在繁忙的工作中做好技术积累,构建个人核心竞争力. 在...

grace_233
今天
9
0
Mariadb二进制包安装,Apache安装

安装mariadb 下载二进制包并解压 [root@test-a src]# wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.t......

野雪球
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部