状态模式(二):下面的代码展示状态的自动切换
//同样,定义状态接口
public interface State {
public void actionA();
public void actionB();
public void actionC();
//...
}
//实现多个状态
public class StateA implements State{
private DemoObject demoObject;
public StateA(DemoObject demoObject){
this.demoObject=demoObject;
}
public void actionA(){
//do something...
}
public void actionB(){}
public void actionC(){
demoObject.setState(demoObject.getStateB()); //切换状态
}
}public class StateB implements State{
private DemoObject demoObject;
public StateB(DemoObject demoObject){
this.demoObject=demoObject;
}
public void actionA(){}
public void actionB(){
demoObject.setState(demoObject.getStateA()); //切换状态
}
public void actionC(){
//do something...
}
}//持有状态的“宿主”对象
public class DemoObject {
State stateA; //定义所有可能出现的状态对象
State stateB; //定义所有可能出现的状态对象
State currentState=stateA; //当前状态对象
public DemoObject(){
stateA=new StateA(this);//为所有状态对象初始化
stateB=new StateB(this);//为所有状态对象初始化
}
public void actionA(){
currentState.actionA();//同前一篇,所有操作委托给当前状态对象
}
public void actionB(){
currentState.actionB();//同前一篇,所有操作委托给当前状态对象
}
public void actionC(){
currentState.actionC();//同前一篇,所有操作委托给当前状态对象
}
public State getStateA(){ //获取stateA对象
return stateA;
}
public State getStateB(){ //获取stateB对象
return stateB;
}
public void setState(State state){
this.currentState=state;
}
}1.如实现状态自动切换,需要状态对象也能更改宿主对象,所以每个状态对象也都持有一个宿主对象的“handle”(这样一来耦合性就增高了)
2.需要实现n(状态数)×m(动作数)个方法。当然,如果某些状态的某些动作是不必要的,也可不必实现。但要小心状态的流转,不要产生“陷阱”