文档章节

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

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
粉丝 91
博文 240
码字总数 210196
作品 0
深圳
程序员
迈向大牛的重要一步——掌握设计模式

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

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

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

learn_more
2015/07/06
0
0
小菜学设计模式——设计模式总结之创建型

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

learn_more
2015/07/05
0
0
小菜学设计模式——工厂方法模式

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

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

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

winters1224
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
3
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
3
0
打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0
搞定Northwind示例数据库,无论哪个版本的SQLServer都受用

Northwind数据库 从这里可以找到突破口: http://social.msdn.microsoft.com/Forums/zh-CN/Vsexpressvb/thread/8490a1c6-9018-40c9-aafb-df9f79d29cde 下面是MSDN: http://msdn2.microsoft......

QQZZFT
昨天
1
0
mysql主从同步,安装配置操作

准备 两台mysql服务,我这里准备了如下: 主库:192.168.176.128 从库:192.168.176.131 如何在Linux上安装mysql服务,请看https://blog.csdn.net/qq_18860653/article/details/80250499 操作...

小致dad
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部