超简代码版设计模式系列十二

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

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

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


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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值