状态模式(State Pattern)

07-11 1505阅读

状态模式(State Pattern)

定义

也称为状态机模式(State Machine Pattern)

通过定义不同的状态类来封装与特定状态相关的行为,并将状态的判断逻辑转移到表示不同状态的一系列类中,从而把复杂的判断逻辑简化。

  • 状态模式将状态和行为分开,使对象在内部状态改变时能够改变它的行为。
  • 每一个状态对应一个子类,从而将状态的转换逻辑分布到状态子类中,减少了相互依赖。
  • 客户端通常不直接与状态对象交互,而是通过环境类(Context)与状态对象进行交互。

    适用场景

    1. 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
    2. 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

    标准示例

    状态模式(State Pattern)

    在状态模式结构图中,通常包含以下几个角色:

    • Context(环境类):也称为上下文类,它是拥有多种状态的对象。在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态。
    • State(抽象状态类):用于定义一个接口以封装与环境类的一个特定状态相关的行为。在抽象状态类中声明了各种不同状态对应的方法,并在子类中实现这些方法。
    • ConcreteState(具体状态类):它是抽象状态类的子类,每一个子类实现一个与环境类的一个状态相关的行为。

      IState

      public interface IState {
          void handle();
      }
      

      ConcreteStateA

      public class ConcreteStateB implements IState{
          public void handle() {
              System.out.println("状态B的动作");
          }
      }
      

      ConcreteStateB

      public class ConcreteStateB implements IState{
          public void handle() {
              System.out.println("状态B的动作");
          }
      }
      

      Context

      public class Context {
          public static final IState STATE_A = new ConcreteStateA();
          public static final IState STATE_B = new ConcreteStateB();
          private IState currentState = STATE_A;
          public void setState(IState state){
              this.currentState = state;
          }
          public void handle(){
              this.currentState.handle();
          }
      }
      

      客户端执行类

      public class ClientTest {
          public static void main(String[] args) {
              Context context = new Context();
              context.handle();
              context.setState(Context.STATE_B);
              context.handle();
          }
      }
      

      执行结果输出为:

      状态A的动作
      状态B的动作
      

      举个生活中常见的例子

      交通信号灯有三种颜色,红、黄、绿。

      它们会按照顺序切换。

      我们使用状态模式,通过代码模拟一下三种信号灯的切换。

      ITrafficState 抽象状态类

      TrafficStateRed 红灯

      TrafficStateYellow 黄灯

      TrafficStateGreen 绿灯

      TrafficContext 上下文类

      public interface ITrafficState {
          String getName();
          void lightChange(TrafficContext context);
      }
      
      @Data
      public class TrafficStateRed implements ITrafficState{
          private String name = "红灯";
          public void lightChange(TrafficContext context) {
              context.setCurrentState(TrafficContext.GREEN_LIGHT);
          }
      }
      
      @Data
      public class TrafficStateYellow implements ITrafficState{
          private String name = "黄灯";
          public void lightChange(TrafficContext context) {
              context.setCurrentState(TrafficContext.RED_LIGHT);
          }
      }
      
      @Data
      public class TrafficStateGreen implements ITrafficState{
          private String name ="绿灯";
          public void lightChange(TrafficContext context) {
              context.setCurrentState(TrafficContext.YELLOW_LIGHT);
          }
      }
      
      public class TrafficContext {
          public static final ITrafficState RED_LIGHT = new TrafficStateRed();
          public static final ITrafficState GREEN_LIGHT = new TrafficStateGreen();
          public static final ITrafficState YELLOW_LIGHT = new TrafficStateYellow();
          private ITrafficState currentState =  GREEN_LIGHT;
          public void setCurrentState(ITrafficState currentState) {
              this.currentState = currentState;
          }
          public void changeLight(){
              System.out.print("当前是:" + this.currentState.getName());
              this.currentState.lightChange(this);
              System.out.println("  || lightChange || 变为 "+this.currentState.getName());
          }
      }
      
      //客户端测试类
      public class ClientTest {
          public static void main(String[] args) {
              TrafficContext context = new TrafficContext();
              //默认绿灯,变为黄灯
              context.changeLight();
              //黄灯 -> 红灯
              context.changeLight();
              //红灯 -> 绿灯
              context.changeLight();
          }
      }
      

      执行结果为:

      当前是:绿灯  || lightChange || 变为 黄灯
      当前是:黄灯  || lightChange || 变为 红灯
      当前是:红灯  || lightChange || 变为 绿灯
      

      以上就是状态模式的全部内容,感谢阅读。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]