状态模式(一):标准定义是允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
老实说如果仅从字面来理解,这段文字相当晦涩。
在前面几种模式的介绍中,我都致力于把代码精简到一页之内。这样,基本上不用我过多解释,也能看的明白。而按照标准教程写这个状态模式的代码,却是比较长的。再结合这个晦涩的定义,就更加不容易懂。所以我决定分成两篇,由浅入深的来观察它。
//首先,我们抽象出一个“状态”的接口。表示在某个状态下可能发生的动作
public interface State {
public void actionA();
public void actionB();
//...假设只有两个动作
}
//实现了状态接口的两个真实状态(不限于两个,还可以更多)
public class StateA implements State{
public void actionA() {
// TODOAuto-generated method stub
}
public void actionB() {
// TODOAuto-generated method stub
}
}
public class StateB implements State{
public void actionA() {
// TODOAuto-generated method stub
}
public void actionB() {
// TODOAuto-generated method stub
}
}
//持有状态的“宿主”对象
public class DemoObject {
private State currentState;//必须记录下当前的状态
public DemoObject(State state){
this.currentState=state;//赋予初始状态
}
//必须具备变更当前状态的方法
public void setState(State state){
this.currentState=state;
}
//对象的动作委托给当前状态对象
public void actionA(){
currentState.actionA();
}
//同上,对象的动作委托给当前状态对象
public void actionB(){
currentState.actionB();
}
}
这就是一个最简单的状态模式了。有没有看起来很眼熟?——其实和策略模式是一样的。因为在这个例子里还没有涉及到状态的自动转换(下一篇继续探讨这个问题)。而DemoObject的状态注入完全由外部操作来完成。但这个例子也能解释定义中的一点:之所以说对象好像修改了它的类,是因为所有的动作都委托给状态对象来完成的。