状态( State )模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
适用性:
所涉及的角色:
抽象状态 (State) 角色:定义一个接口,用以封装对象的一个特定状态所对应的形为。
具体状态 (Concrete State) 角色:每一个具体状态类都实现环境( Context )的一个状态所对应的行为。
环境( Context )角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出些环境对象的现有状态。一个简单的例子:抽象状态State类
具体状态类ConcreteStateA和ConcreteStateB:
状态模式与策略模式的区别:
两个模式很容易混淆,区别两者的一个方法是考察环境角色是否有明显的状态和状态过渡。如果环境角色只有一个状态,那么就应当使用策略模式。策略模式的特点:一旦环境角色选择了一个具体的策略类,那么在整个环境类的生命周期里它都不会改变这个具体策略类。而状态模式则适用另一情况,即环境角色有明显的状态转移。在环境类的生命周期里面,会有几个不同的状态被使用。
另外一个微妙的区别在于策略模式的环境自己选择一个具体的策略类,而状态模式的环境类是被外在原因放进一个具体的状态中。
策略模式所选择的策略类往往不明显的告诉客户端它所选择的具体策略类,而状态模式则相反,环境角色所处的状态是明显告诉客户端的。参考资料:《java与模式》《设计模式速查手册》http://blog.csdn.net/qutr/archive/2006/08/01/1007617.aspx