Java 中的状态模式:通过状态封装增强行为动态性
大约 2 分钟
也称为
- 状态对象
状态设计模式的意图
使对象能够在它的内部状态改变时动态地改变它的行为,从而优化 Java 应用程序的响应能力。
状态模式的详细解释以及现实世界中的例子
现实世界中的例子
想象一个十字路口的交通灯系统。交通灯可以处于三种状态之一:绿灯、黄灯或红灯。根据当前状态,交通灯的行为会发生变化
- 绿灯状态:允许车辆通过十字路口。
- 黄灯状态:提醒车辆灯光即将变红,因此它们应该准备停止。
- 红灯状态:车辆必须停止并等待灯光变绿。
在这种情况下,交通灯使用状态设计模式。每个状态(绿灯、黄灯、红灯)由不同的对象表示,该对象定义在特定状态下会发生什么。交通灯(上下文)将行为委托给当前状态对象。当状态发生变化(例如,从绿灯变为黄灯)时,交通灯会更新其状态对象并相应地改变其行为。
简单来说
状态模式允许对象改变其行为。
维基百科说
状态模式是一种行为型软件设计模式,它允许对象在它的内部状态改变时改变它的行为。这种模式与有限状态机的概念很接近。状态模式可以被解释为一种策略模式,它能够通过调用模式接口中定义的方法来切换策略。
Java 中状态模式的编程示例
在我们的编程示例中,有一只情绪交替的猛犸象。
首先,这是状态接口及其具体的实现。
public interface State {
void onEnterState();
void observe();
}
@Slf4j
public class PeacefulState implements State {
private final Mammoth mammoth;
public PeacefulState(Mammoth mammoth) {
this.mammoth = mammoth;
}
@Override
public void observe() {
LOGGER.info("{} is calm and peaceful.", mammoth);
}
@Override
public void onEnterState() {
LOGGER.info("{} calms down.", mammoth);
}
}
@Slf4j
public class AngryState implements State {
private final Mammoth mammoth;
public AngryState(Mammoth mammoth) {
this.mammoth = mammoth;
}
@Override
public void observe() {
LOGGER.info("{} is furious!", mammoth);
}
@Override
public void onEnterState() {
LOGGER.info("{} gets angry!", mammoth);
}
}
这里还有包含状态的猛犸象。状态通过调用 timePasses
方法来改变。
public class Mammoth {
private State state;
public Mammoth() {
state = new PeacefulState(this);
}
public void timePasses() {
if (state.getClass().equals(PeacefulState.class)) {
changeStateTo(new AngryState(this));
} else {
changeStateTo(new PeacefulState(this));
}
}
private void changeStateTo(State newState) {
this.state = newState;
this.state.onEnterState();
}
@Override
public String toString() {
return "The mammoth";
}
public void observe() {
this.state.observe();
}
}
以下是猛犸象随着时间的推移如何行为的完整示例。
public static void main(String[] args) {
var mammoth = new Mammoth();
mammoth.observe();
mammoth.timePasses();
mammoth.observe();
mammoth.timePasses();
mammoth.observe();
}
程序输出
The mammoth gets angry!
The mammoth is furious!
The mammoth calms down.
The mammoth is calm and peaceful.
何时在 Java 中使用状态模式
- 对象的行为取决于它的状态,它必须根据该状态在运行时改变它的行为。
- 操作有大型的、多部分的条件语句,这些语句取决于对象的当前状态。
Java 中状态模式的现实世界应用
- Java 集合框架中的
java.util.Iterator
使用不同的状态进行迭代。 - 网络编程中的 TCP 连接类通常实现
已建立
、监听
和关闭
等状态。
状态模式的优点和权衡
优点
- 将特定于状态的行为本地化并对不同状态的行为进行分区。
- 使状态转换明确。
- 可重用的状态对象可以在 Java 中的各种上下文之间有效地共享,从而增强内存管理和性能。
权衡
- 可能导致大量状态类。
- 上下文类可能会因状态转换逻辑变得复杂。