Atitit. 状态模式(State)attilax 总结 跟个策 略模式的区别
2. 状态的维护和转换:① 在Context 中。② 在状态的处理类中。2
1. 状态模式(State)概览
Context :环境,也称为上下文,用来定义客户感兴趣的接口,同时维护一个具体处理当前状态的实例对象。
State:状态接口,用来封装与上下文的一个特定状态所对应的行为。
ConcreteState:具体实现状态的处理类,每个实现一个跟上下文相关联的状态的具体处理。
作者::老哇的爪子Attilax艾龙,EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
2. 状态的维护和转换:① 在Context 中。② 在状态的处理类中。
维护状态的数据,给状态设置不同的状态值;状态的转换,指的是根据状态的变化来选择不同的状态处理对象。
有两个地方可以进行状态的维护和转换:
① 在Context 中。② 在状态的处理类中。
如何选择者两种方式:
● 如果状态转换的规则是一定的,一般不需要进行什么扩展规则,那么就适合在上下文中统一进行状态的维护。
● 如果状态的转换取决于前一个状态动态处理的结果,或者是依赖外部数据,为了增强灵活性,这种情况下,一般式在状态处理类中进行状态的维护。
从上面可以看出,环境类Context的行为request()是委派给某一个具体状态类的。通过使用多态性原则,可以动态改变环境类Context的 属性State的内容,使其从指向一个具体状态类变换到指向另一个具体状态类,从而使环境类的行为request()由不同的具体状态类来执行。
3. 状态模式和策略模式的比较
策 略模式的类图和状态模式的类图实现是很相似的,这也是为什么设计模式中,我们把这两种模式比喻成为孪生兄弟,很多时候,我们在运用上述模式来解决实际问题 的时候,也经常混淆他们,其实,个人倒是认为,就算大家用法不同其实也没有必要介意,因为设计模式的应用是紧贴着设计原则来走的,不论是状态模式,还是策 略模式,我们都是紧紧的遵守着开闭原则,里氏代换原则,和迪米特原则,充分的面向接口编程,利用封装特性;策略模式主要是考虑到当我们要增加新的算法策略 的时候,如何能在最小代价下面实现增加,最典型的应用就是莫过于在超市商场的“多样的”打折算法下面,
状态模式(state pattern)和策略模式(strategy pattern)的实现方法非常类似,都是利用多态把一些操作分配到一组相关的简单的类中,因此很多人认为这两种模式实际上是相同的。然而
· 在现实世界中,策略(如促销一种商品的策略)和状态(如同一个按钮来控制一个电梯的状态,又如手机界面中一个按钮来控制手机)是两种完全 不同的思想。当我们对状态和策略进行建模时,这种差异会导致完全不同的问题。例如,对状态进行建模时,状态迁移是一个核心内容;然而,在选择策略时,迁移 与此毫无关系。另外,策略模式允许一个客户选择或提供一种策略,而这种思想在状态模式中完全没有。
在状态模式中,状态的变迁是由对象的内部条件决定,外界只需关心其接口,不必关心其状态对象的创建和转化;而策略模式里,采取何种策略由外部条件(C)决定。
区别在于,策略模式中需要客户端传入具体的策略对象,然后由context这个控制类来提供服务。而状态模式则是由客户端传入状态标记,由context判断并切换到符合条件的状态对象。
参考
Java 设计模式 之 状态模式(State) - 低调的华丽的日志 - 网易博客.htm
状态模式和策略模式的比较 - Mainz - 博客园.htm