状态模式实现依赖于状态的行为

应用场景描述: 一个开关可以被pull或者push,共有三种不同的颜色,称为状态,每种不同的颜色下执行push或者pull得到的下一个状态不同,即一个有穷状态机,对不同的输入有不同的响应。因为状态改变比较复杂,因此不用if和else来实现。而是定义一个state的父类,然后开关不同的颜色继承这个state父类。根据不同的pull或者push来改变颜色。

the State and Stategy
How to implement state-dependent behavior  
The state patterns

具体的应用场景:

例如: 经典的TcpConnection, Tcp的状态有创建 侦听 关闭三个,并且反复转换,其创建 侦
听 关闭的具体行为不是简单一两句就能完成的,适合使用 State
例如:信箱 POP 帐号, 会有四种状态, start HaveUsername Authorized quit,每个状态对应
的行为应该是比较大的.适合使用 State
例如:在工具箱挑选不同工具,可以看成在不同工具中切换,适合使用 State.如 具体绘图程
序,用户可以选择不同工具绘制方框 直线 曲线,这种状态切换可以使用 State.

public class Context{

   private Sate state=null;  // 状态管理者Context有state成员


   pulic void setState(State state)    //setState 是用来改变 state 的状态 使用 setState 实现状态的切换

{

     this.state=state;
   }

public void push(){

   state.handlepush(this);            //状态的切换的细节部分,在本例中是颜色的变化,已经封装在子类的handlepush 中实现,这里无需关心

//即context类里的state这个成员状态的改变不是由context完成的,而是state自己改变了context的状态,见后面state的定义

     Sample sample=new Sample(state.getColor()); //因为 sample 要使用 state 中的一个切换结果,使用 getColor()
     sample.operate();  
   }


public void pull(){
    state.handlepull(this);
Sample2 sample2=new Sample2(state.getColor());
  sample2.operate();  
   }

}


状态类继承state父类,实现不同的状态下的不同行为

public class BlueState extends State{
   public void handlepush(Context c){
      //根据 push 方法"如果是 blue 状态的切换到 green" ;
      c.setState(new GreenState());    // 这样context类无需关心自己的当前状态是啥,因为state类已经在此处操作了
   }
   public void handlepull(Context c){
      //根据 pull 方法"如果是 blue 状态的切换到 red" ; 

   c.setState(new RedState());
   }
   public abstract void getcolor(){ return (Color.blue)}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值