定义
状态模式属于对象的行为模式。
状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。这个模式将状态封装成为单独的类,并将动作委托到代表当前状态的对象。
一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的对象。
结构和角色
抽象状态(State)角色 : 定义一个接口,用以封装环境对象的一个特定的状态所对应的行为。
具体状态(ConcreteSate)角色 : 每一个具体状态类都实例了环境的一个状态所对应的行为。
环境(Context)角色 : 保留各种具体状态对象,和定义当前状态对象。 此类的行为委派给具体State对象。
什么时候使用状态模式
一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变。
对象在某个方法里依赖一重或多重的条件转移语句。状态模式把条件转移语句的每一个分支都包装到一个单独的类里。
应用
状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。所有与一个特定的状态有关的行为都被包装到一个特定的对象里面,使得行为的定义局域化。
状态改变,不必采用过程性的处理方式,来改变行为。
优缺点
便于维护和扩展,遵守开闭原则,
缺点是,会造成大量的小的状态类。
这个模式的结构图和策略模式的结构图是一样的,不过他们的意图不一样。
环境角色是否有明显的状态和状态的过渡。如果环境角色只有一个状态, 那么应当使用策略模式。
策略模式,一旦环境角色选择了一个具体策略类,那么在整个环境类的生命周期里它都不会改变这个具体策略类。
状态模式,环境角色有明显的状态转移,在环境类的生命周期里面,会有几个不同的状态对象被使用。