设计模式(20/23) - 状态模式

107 阅读3分钟

状态模式

1 概述

  • 状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为。状态模式通过将状态的行为封装到不同的状态对象中,使得对象在不同状态下具有不同的行为。
  • 这种模式通过引入状态对象,将状态的行为封装起来,从而使得状态的切换更加灵活和可扩展。

2 优缺点及应用场景

2.1 优点

  • 1)状态与行为分离:状态模式将状态与行为封装在不同的对象中,使得状态切换更加灵活。
  • 2)简化复杂状态逻辑:通过将状态相关的行为封装在状态对象中,简化了复杂的状态转换逻辑。
  • 3)符合开闭原则:可以通过增加新的状态类来扩展新的状态和行为,而无需修改现有代码。

2.2 缺点

  • 1)增加类的数量:每个状态都需要定义一个类,增加了系统的类数量。
  • 2)状态切换复杂性:状态之间的切换可能会比较复杂,增加了维护难度。

2.3 应用场景

  • 1)对象的行为依赖于状态:对象的行为依赖于其状态,并且需要根据状态进行切换的场景。
  • 2)状态切换较为复杂:状态之间的转换逻辑比较复杂的场景。
  • 3)需要扩展状态和行为:需要在不修改现有代码的情况下扩展新的状态和行为的场景。

3 结构

  • 1)上下文(Context):维护一个状态对象的引用,定义了客户端需要的接口。
  • 2)状态(State):定义状态的接口,封装与上下文的一个特定状态相关的行为。
  • 3)具体状态(ConcreteState):实现状态接口,封装具体状态相关的行为。

4 实现

4.1 UML 类图

状态模式.jpg

4.2 代码示例

// 创建一个接口
interface State {
  public void doAction(Context context);
}

// 创建实现接口的实体类:开始状态
class StartState implements State {
  public void doAction(Context context) {
    System.out.println("Player is in start state");
    context.setState(this);
  }

  public String toString() {
    return "Start State";
  }
}

// 创建实现接口的实体类:停止状态
class StopState implements State {
  public void doAction(Context context) {
    System.out.println("Player is in stop state");
    context.setState(this);
  }

  public String toString() {
    return "Stop State";
  }
}

// 创建 Context 类
class Context {
  private State state;

  public Context() {
    state = null;
  }

  public void setState(State state) {
    this.state = state;
  }

  public State getState() {
    return state;
  }
}

// 使用示例
public class StatePatternDemo {
  public static void main(String[] args) {
    // 使用 Context 来查看当状态 State 改变时的行为变化
    Context context = new Context();

    StartState startState = new StartState();
    startState.doAction(context);

    System.out.println(context.getState().toString());

    StopState stopState = new StopState();
    stopState.doAction(context);

    System.out.println(context.getState().toString());
  }
}
  • 执行程序,输出结果:
Player is in start state
Start State
Player is in stop state
Stop State

5 总结

  • 状态模式通过将状态的行为封装到不同的状态对象中,使得对象在不同状态下具有不同的行为。状态模式适用于对象的行为依赖于状态、状态切换较为复杂以及需要扩展状态和行为的场景。尽管状态模式增加了类的数量和状态切换的复杂性,但它在简化复杂状态逻辑、提高系统扩展性和灵活性方面具有显著优势。在实际应用中,需要根据具体需求合理使用状态模式,以实现灵活可扩展的系统设计。