状态(State)模式:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的状态。
State:状态,定义抽象接口;
ConcreteState:具体状态类,每个子类实现一个Context的一个状态相关的行为;
Context:定义客户感兴趣的接口,维护一个ConcreteState子类的实例,这个实例定义为当前状态;
适用性:
(1)一个对象的行为取决于它的状态,并且它必须在允许时刻根据状态改变它的行为;
(2)一个操作有大量多分支的条件语句,且分支依赖于对象的状态。这个状态通常用一个或多个枚举常量表示;
优点:
(1)将所有与一个特定状态相关的行为放入一个类中,把不同的状态分割开来,使得增加新的状态很方便;
(2)使的状态的转换更加清晰;
(3)当State对象没有实例变量时,Context对象可以共享一个State对象;
缺点:
状态过多,会造成大量子类不方便管理
实现:
(1)为了让转换更灵活,
Context中需要增加一个接口ChangeState,让State对象转换当前状态。缺点是一个State中包含其他State,造成了各个子类的依赖;
(2)可以使用表将每一个可能的输入映射到一个后继状态,这种方法将条件代码映射到一个查找表。缺点是效率低,可读性差,传入参数不方便;
(3)Context可以将自身作为一个参数传递给处理该请求的状态对象,让状态对象在方便时可以访问Context;
(4)当进入状态在运行时不可知时,并且不经常变更状态时,选择需要State对象时才创建并随后销毁;当State对象存储大量信息,并且状态改变很频繁时,应该预先创建并且始终不销毁它们;