行为型 中等
状态模式
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