模式特点
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。状态模式将状态逻辑从对象中分离出来。
- 每个状态封装为独立类,行为随状态切换而变化
- 消除大量的 if-else / switch 状态判断
- 状态转换逻辑由状态类自身管理
- 新增状态只需新增状态类,符合开闭原则
类图
应用场景
- Qt 中 QStateMachine 状态机框架
- 机器人运行状态:空闲 → 运动 → 暂停 → 异常 → 急停
- TCP 连接状态:CLOSED → SYN_SENT → ESTABLISHED → CLOSED
- 示教器模式切换:示教模式 → 运行模式 → 调试模式
- 媒体播放器:停止 → 播放 → 暂停 → 缓冲
示例代码(C++)
class RobotContext; // 抽象状态 class RobotState { public: virtual void handle(RobotContext* ctx) = 0; virtual ~RobotState() = default; }; // 上下文 class RobotContext { RobotState* m_state; public: RobotContext(RobotState* s) : m_state(s) {} void setState(RobotState* s) { m_state = s; } void request() { m_state->handle(this); } }; // 具体状态 - 空闲 class IdleState : public RobotState { public: void handle(RobotContext* ctx) override { std::cout << "[空闲] 收到启动指令,切换到运动状态" << std::endl; ctx->setState(new RunningState()); // 需要前向声明 }}; // 具体状态 - 运动中 class RunningState : public RobotState { public: void handle(RobotContext* ctx) override { std::cout << "[运动中] 收到停止指令,切换到空闲状态" << std::endl; ctx->setState(new IdleState()); }}; // 使用:状态自动切换,无需 if-else RobotContext robot(new IdleState()); robot.request(); // 空闲 → 运动 robot.request(); // 运动 → 空闲