状态模式(一):标准定义是允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

老实说如果仅从字面来理解,这段文字相当晦涩。

在前面几种模式的介绍中,我都致力于把代码精简到一页之内。这样,基本上不用我过多解释,也能看的明白。而按照标准教程写这个状态模式的代码,却是比较长的。再结合这个晦涩的定义,就更加不容易懂。所以我决定分成两篇,由浅入深的来观察它。


//首先,我们抽象出一个“状态”的接口。表示在某个状态下可能发生的动作

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的状态注入完全由外部操作来完成。但这个例子也能解释定义中的一点:之所以说对象好像修改了它的类,是因为所有的动作都委托给状态对象来完成的。