状态模式:
状态与策略是十分相近的模式,只是"意向"不同。
现在的自动贩卖机,如何设计:
首先我们可以看到自动贩卖机的几个状态:
1. 没有钱
2. 加入钱
3.选择
4 出货
5 无货
1——>2: action: put money
2——>3: pick
3——>4: drink out
if(count > 0) 4——>1
else 4——>5
public class machine {
public void insertMoney();
public void pick();
public void out();
}
如果不使用模式,最直接的方法会是,使用if/else 判断来根据machine处于的不同状态,来进行操作
比如,在1时,pick是没用的...
但是就用前面讲到过的策略模式一样,我们要做的就是封装变化
这里什么是变化的? 明显:state
将操作抽象到接口或抽象类State
然后不同的状态实现或继承State
如:
public class NoMoney extends state{
private Machine machine;
public void setXX()....
public void insertMoney(){
machine.setState(machine.getMoneyInState());
}
}
NoMoney是1 状态
只有insertMoney对它是有用的,其他的方法可以在State中有默认的实现(这种处理方法已经用到了多次)
它完成了状态的转换
当然这些状态的转换,可以放在状态类中,也可以放在machine中,区别是,放在状态类中的话,状态类之间就耦合了
这是十分不好的,因此我认为状态的转换还是放在machine中好:
public class Machine {
public state NoMoney;
public State MoneyIn;
....
public State state;
public void insertMoney(){
state.insertMoney(); //这里state是NoMoney
state = moneyIn; // 转换
}
}
而且,这样一旦添加了新的状态,我们一般不需要去改已存在状态的逻辑,而可以去修改machine,因为状态之间的逻辑
是放在machine中的,这样比较有弹性,对修改关闭,对扩展开放
现在来看看,策略和状态的区别:
从形式上,甚至类图上,两者没有明显的区别,可以说是一样的。
两者的不同是在思想上,策略模式,是主动的动态修改实体的行为,主动选择行为,
状态模式不同,状态的改变,导致了行为的不同,不能主动修改行为,只能根据状态来执行,可以说行为的顺序,或者说行为模式已经定死了