背景
就算你重复做一件事情几十年,这件事情也未必每次都和上一次一样那么干净的结束。因为,状态会影响的你,不同的状态,所做出的事情自然也不一样。库里状态手感火热的时候,可以展示变态准;状态低迷时,直接被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其实都是相互依赖的,具体状态直接也是有依赖关系的。