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

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

//同样,定义状态接口

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值