状态模式
通过改变对象内部的状态来帮助对象控制自己的行为
状态机
状态图
实现1.0
状态
final static int SOLD_OUT = 0;
final static int NO_QUARTER = 1;
final static int HAS_QUARTER = 2;
final static int SOLD = 3;
int state;
动作
public void *(){
if(state == SOLD_OUT){
// TODO
}else if(state == NO_QUARTER){
// TODO
}else if(state == HAS_QUARTER){
// TODO
}else if(state == SOLD){
// TODO
}
}
问题
如果将来加入了新的状态,全部动作方法都要做出修改
- 不符合开放-关闭原则
- 新加入代码可能有bug
- 状态转换藏在条件语句中,不明显
实现2.0
- 定义一个state接口
- 每个状态实现状态类,负责对应状态下的行为
- 将动作委托到状态类
- 状态机上的每一个状态是一个状态类
上下文(糖果机类)
状态类
问题
还是有耦合,如果增加了新的状态类还是需要在上下文中进行修改
解决方法:
状态类的获取从容器中获取,或者通过反射生成,不写死在上下文类中
状态模式
-
状态流向
- 固定转换,适合放在context中
- 动态更换,适合放在状态类中
-
多个context实例可以共享状态对象。
- 前提:状态对象不能持有他们自己的内部状态
- 需要把每个状态指定到静态的实例变量中