总述
The State Pattern通过改变对象内部的状态来帮助对象控制它们的行为。
The State Pattern适用于同一个东西从一种状态到另一种状态的转换,它涉及到引起这种状态转换的因子。
如何把这些状态转换为代码?
1、整理这些状态。
2、创建一个实例,并定义表示各状态的数字。
3、整理出所有的事件,每一个事件都是一个接口,你通过实现它们来驱动状态的转换。
4、写这么一个类,代表一台机器,对于每个动作我们写一个方法,每个方法都去检查状态字,针对输入的状态给出相应的反应。
以上其实是在对象内部建立状态模型的过程。
状态模式在两个状态之间把当前的状态呈现出来,以指示下一个状态的进行。这看上去是一种交互,我感觉跟做手机APP差不多。
果然不出我所料,这些代码堆在一起修改的成本太高,肯定要改。
The new design
1、定义一个状态接口,里面包含了一个方法,这个方法对于所有的转换动作都是适用的,即,普遍适用。
2、为每个状态定义一个类,当机器处于转换状态时该类能够完成转换行为。
3、摆脱所有条件代码,委托状态类为我们工作。
为什么这么设计?
这样做的好处就是可以把可变行为和不可变行为分别集中化,然后处理。
我们需要指定每个状态类的具体行为。
新的设计用实现了state接口的4个不同的状态对象来表示4个不同的状态,每个不同对象的类的构造函数完成了不同状态之间的转换。
if语句有啥坏处?
if语句块是非常难以维护的。
严格封装每个状态类,使之不被更动,转而让呈现各种状态的主体通过添加状态对象的方法来改变自身的状态。
提供了类和代码的结构定式,这种结构很合适,也容易理解和阅读。
当一个动作发生的时候,它是交给某一个状态对象来处理的。
The State Pattern defined
该模式允许对象内部状态改变的时候改变自身的行为,这个对象似乎要改变它的类。
P448展示了这种模式的类图设计。
the State Pattern与the Strategy Pattern的区别
对于前者而言改变是发生在对象内部,对于用户而言是透明的。
后者所需要复合的对象是由用户指定的。
策略模式是在某种行为的基础上添加别的行为来改变行为,它一般是通过改变子类实现的。
状态模式是通过把不同状态的对象封装进主体,该主体会根据不同的条件来改变自身的行为。
状态模式中的各种状态对象是可以共享的,方法是通过一个static的状态对象来实现。
使用状态模式会导致在你的设计里面出现很多的类。
表示状态的类可以被多个主体类共享。
主体类和状态类都可以控制状态转换。