行为型 中等

状态模式

State Pattern

允许对象在内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

概述

状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。

适用场景

  • 当对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时
  • 当代码中包含大量与对象状态有关的条件语句时

优点

  • +单一职责原则:将与特定状态相关的代码放在单独的类中
  • +开闭原则:无需修改现有状态类和上下文就能引入新状态
  • +通过消除臃肿的状态机条件语句简化上下文代码

缺点

  • 如果状态机只有很少的几个状态,或者很少发生改变,那么应用该模式可能会显得小题大做

结构

classDiagram class State { <<interface>> +handle(context) void } class ConcreteStateA { +handle(context) void } class ConcreteStateB { +handle(context) void } class ConcreteStateC { +handle(context) void } class Context { -state: State +setState(state) void +request() void } State <|.. ConcreteStateA : implements State <|.. ConcreteStateB : implements State <|.. ConcreteStateC : implements Context o--> State : uses style State fill:#fff3e0,stroke:#f57c00,stroke-width:2px style Context fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style ConcreteStateA fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px style ConcreteStateB fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px style ConcreteStateC fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px

交互演示

对象在状态改变时改变行为
ContextDocument
状态: Draft
状态转换
当前行为
✏️
允许编辑

点击状态按钮,观察同一方法在不同状态下的不同行为

生活类比

状态模式就像是交通信号灯

交通信号灯

信号灯在不同状态(红、黄、绿)下有不同的行为,状态转换由当前状态决定。

代码实现

Example.java

实际应用

Thread States

Java 线程的状态转换(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED)使用状态模式。

Example.java

练习

1

状态模式的主要目的是什么?