【设计模式】19-状态模式

什么是状态模式

对象中的状态变更引起其状态相关的行为发生变更。将状态进行封装,使状态的变更在具体状态类中进行传递,从而控制各个状态下的行为。

 

为什么要用状态模式

当一个对象中有很多状态,且各个状态引起不同的行为切换时,可避免繁乱的分支判断,即可以用状态模式,将行为封装,并通过状态模式中的环境角色封装状态切换。

 

状态模式组成

状态行为接口

public interface StateOpt{
      /**
      * 行为1
      */
   void opt1();

      /**
       * 行为2
       */
   void opt2();
}

 

 

抽象状态类

public abstract class AbstractState implements StateOpt{
   /**
    * 定义一个环境橘色,用户状态之间的变更传递
    */
   protected Context context;

   public void setContext(Context context) {
      this.context = context;
   }
}

 

 

具体状态角色

public class ConcreteAbstractState1 extends AbstractState {

   @Override
   public void opt1() {
      System.out.println("state 1 opt");
   }

   @Override
   public void opt2() {
      super.context.setCurrentState(super.context.STATE2);
      super.context.opt2();
   }
}
public class ConcreteAbstractState2 extends AbstractState {

   @Override
   public void opt1() {
      super.context.setCurrentState(super.context.STATE1);
      super.context.opt1();
   }

   @Override
   public void opt2() {
      System.out.println("state 2 opt");
   }
}

 

 

上下文环境角色

public class Context implements StateOpt{
   public final AbstractState STATE1 = new ConcreteAbstractState1();
   public final AbstractState STATE2 = new ConcreteAbstractState2();

   private AbstractState currentState;

   public AbstractState getCurrentState() {
      return currentState;
   }

   public void setCurrentState(AbstractState currentState) {
      //切换状态
      this.currentState = currentState;
      //传递环境角色
      this.currentState.setContext(this);
   }

   @Override
   public void opt1(){
      //委托当前状态对象处理
      this.currentState.opt1();
   }

   @Override
   public void opt2(){
      this.currentState.opt2();
   }
}

 

 

测试驱动

public class Client {

   public static void main(String[] args) {
      Context context = new Context();
      context.setCurrentState(context.STATE1);

      context.opt1();
      context.opt2();
   }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值