← 返回博客列表

模式特点

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。状态模式将状态逻辑从对象中分离出来。

类图

类图

应用场景

示例代码(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();  // 运动 → 空闲