目录
[2.1 模式结构](#2.1 模式结构)
[2.2 实现案例](#2.2 实现案例)
1、核心思想
目的:将状态相关逻辑封装到独立的类中,消除复杂的条件分支,状态的切换由具体状态类自身管理
举例:
1> 交通灯红绿黄切换
2> 台灯通电与断电切换
2、实现方式
2.1 模式结构
三个核心角色:
- State(状态接口):定义通用的状态规范标准,其中处理请求方法handle()将系统环境Context作为参数传入。
- ConcreteStateA、ConcreteStateB、ConcreteStateC(状态实现A、状态实现B、状态实现C):具体的状态实现类,定义该状态下的行为,并可触发状态转换。
- Context(系统环境):系统的环境,持有当前状态的引用,提供修改状态的方法setState(),对外暴露请求发起方法request()

2.2 实现案例
假设电梯有运行中、停止、故障三种状态,不同状态下对开门、关门的响应不同
java
//1、状态接口
public interface ElevatorState {
void openDoor();
void closeDoor();
void run();
void stop();
}
//2、状态实现类
// 停止状态
public class StoppedState implements ElevatorState {
@Override
public void openDoor() {
System.out.println("开门成功(已停止)");
}
@Override
public void closeDoor() {
System.out.println("关门成功(已停止)");
}
@Override
public void run() {
System.out.println("电梯开始运行");
}
@Override
public void stop() {
System.out.println("电梯已是停止状态");
}
}
// 运行状态
public class RunningState implements ElevatorState {
@Override
public void openDoor() {
System.out.println("运行中禁止开门!");
}
@Override
public void closeDoor() {
System.out.println("门已关闭(运行中)");
}
@Override
public void run() {
System.out.println("电梯已在运行中");
}
@Override
public void stop() {
System.out.println("电梯停止运行");
}
}
// 故障状态
public class ErrorState implements ElevatorState {
@Override
public void openDoor() {
System.out.println("故障中,禁止操作!");
}
@Override
public void closeDoor() {
System.out.println("故障中,禁止操作!");
}
@Override
public void run() {
System.out.println("故障中,禁止操作!");
}
@Override
public void stop() {
System.out.println("故障中,禁止操作!");
}
}
//3、系统环境类:电梯控制器
public class ElevatorController {
private ElevatorState currentState;
public ElevatorController() {
currentState = new StoppedState(); // 初始状态为停止
}
public void setState(ElevatorState state) {
this.currentState = state;
}
public void openDoor() {
currentState.openDoor();
}
public void closeDoor() {
currentState.closeDoor();
}
public void run() {
currentState.run();
// 状态切换逻辑可在此或具体状态中实现
}
public void stop() {
currentState.stop();
}
}
//4、客户端
public class Client {
public static void main(String[] args) {
ElevatorController elevator = new ElevatorController();
elevator.openDoor(); // 输出:开门成功(已停止)
elevator.run(); // 输出:电梯开始运行
elevator.openDoor(); // 输出:运行中禁止开门!
elevator.stop(); // 输出:电梯停止运行
}
}
3、优缺点分析
优点:
-
单一职责原则:每个状态类的职责明确,代码清晰。
-
开闭原则:新增状态无需修改现有代码。
-
消除条件分支 :用多态代替复杂的
if-else
逻辑。 -
状态转换内聚:状态切换逻辑封装在状态类中,避免分散在多个地方。
缺点:
-
类数量增加:每个状态需要一个类,可能导致类膨胀。
-
状态转换复杂度:若状态间转换逻辑复杂,可能增加维护难度。
-
上下文依赖:状态类可能需要反向引用上下文(Context),导致耦合。
4、适用场景
-
对象行为依赖状态
- 例如:订单状态(待支付、已发货、已完成)、游戏角色状态(站立、奔跑、跳跃)。
-
需要频繁切换状态
- 例如:线程生命周期管理(新建、运行、阻塞、终止)。
-
替代复杂的状态条件判断
- 例如:工作流引擎、电梯控制、交通灯系统。
实际应用:
-
Java线程状态管理
Thread
类的状态(NEW, RUNNABLE, BLOCKED等)通过内部状态转换控制行为。 -
Spring状态机(State Machine)
用于实现复杂的状态转换逻辑,如订单流程、审批流程。
-
游戏开发
角色状态(移动、攻击、防御)通过状态模式切换动画和逻辑。
5、注意事项
-
避免状态膨胀:若状态过多,可考虑组合模式或子状态划分。
-
状态初始化:确保上下文对象的初始状态正确设置。
-
线程安全:多线程环境下需保证状态转换的原子性(如加锁)。