状态模式(二):下面的代码展示状态的自动切换

//同样,定义状态接口

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(动作数)个方法。当然,如果某些状态的某些动作是不必要的,也可不必实现。但要小心状态的流转,不要产生“陷阱”