状态模式 (State Pattern)

状态模式 (State Pattern)

意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

基础组件
  • State (状态):定义状态接口
  • ConcreteState (具体状态):实现特定状态的行为
  • Context (上下文):维护当前状态,并将请求委托给状态对象
继承/实现关系
State <|-- ConcreteStateA
State <|-- ConcreteStateB
Context --> State (组合关系)
应用场景
  • 对象行为取决于其状态,且状态转换复杂
  • 避免大量条件判断语句
  • 状态转换逻辑需要封装
C++ 实现(电梯状态)
#include <iostream>
#include <string>
#include <memory>

/*
 * 状态模式
 * 意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
 * 基础组件:
 * - State (状态):定义一个接口以封装与 Context 的一个特定状态相关的行为。
 * - ConcreteState (具体状态):实现 State 接口,定义与 Context 的一个特定状态相关的行为。
 * - Context (上下文):维护当前状态,并将请求委托给状态对象
 * 继承/实现关系:
 * ConcreteStateA/B/C 类继承自 State 接口。
 * Context 类持有 State 接口的引用,可以在运行时切换不同的状态(ConcreteStateA/B/C)。
 */

class Elevator;

// 状态接口
class ElevatorState {
public:
    virtual ~ElevatorState() = default;
    virtual void openDoors(Elevator* elevator) = 0;
    virtual void closeDoors(Elevator* elevator) = 0;
    virtual void move(Elevator* elevator) = 0;
    virtual void stop(Elevator* elevator) = 0;
};

// 具体状态:停止状态
class StoppedState : public ElevatorState {
public:
    void openDoors(Elevator* elevator) override;
    void closeDoors(Elevator* elevator) override;
    void move(Elevator* elevator) override;
    void stop(Elevator* elevator) override;
};

// 具体状态:运行状态
class MovingState : public ElevatorState {
public:
    void openDoors(Elevator* elevator) override;
    void closeDoors(Elevator* elevator) override;
    void move(Elevator* elevator) override;
    void stop(Elevator* elevator) override;
};

// 具体状态:开门状态
class OpenState : public ElevatorState {
public:
    void openDoors(Elevator* elevator) override;
    void closeDoors(Elevator* elevator) override;
    void move(Elevator* elevator) override;
    void stop(Elevator* elevator) override;
};

// 上下文:电梯
class Elevator {
public:
    Elevator() : state_(std::make_unique<StoppedState>()) {}

    void setState(std::unique_ptr<ElevatorState> state) {
        state_ = std::move(state);
    }

    void openDoors() {
        state_->openDoors(this);
    }

    void closeDoors() {
        state_->closeDoors(this);
    }

    void move() {
        state_->move(this);
    }

    void stop() {
        state_->stop(this);
    }

    void displayState(const std::string& action) {
        std::cout << action << " [Current State: "
            << typeid(*state_).name() << "]\n";
    }

private:
    std::unique_ptr<ElevatorState> state_;
};

// 停止状态实现
void StoppedState::openDoors(Elevator* elevator) {
    elevator->displayState("Opening doors");
    elevator->setState(std::make_unique<OpenState>());
}

void StoppedState::closeDoors(Elevator* elevator) {
    elevator->displayState("Doors already closed");
}

void StoppedState::move(Elevator* elevator) {
    elevator->displayState("Starting movement");
    elevator->setState(std::make_unique<MovingState>());
}

void StoppedState::stop(Elevator* elevator) {
    elevator->displayState("Already stopped");
}

// 运行状态实现
void MovingState::openDoors(Elevator* elevator) {
    elevator->displayState("Cannot open doors while moving");
}

void MovingState::closeDoors(Elevator* elevator) {
    elevator->displayState("Doors already closed");
}

void MovingState::move(Elevator* elevator) {
    elevator->displayState("Already moving");
}

void MovingState::stop(Elevator* elevator) {
    elevator->displayState("Stopping elevator");
    elevator->setState(std::make_unique<StoppedState>());
}

// 开门状态实现
void OpenState::openDoors(Elevator* elevator) {
    elevator->displayState("Doors already open");
}

void OpenState::closeDoors(Elevator* elevator) {
    elevator->displayState("Closing doors");
    elevator->setState(std::make_unique<StoppedState>());
}

void OpenState::move(Elevator* elevator) {
    elevator->displayState("Cannot move with doors open");
}

void OpenState::stop(Elevator* elevator) {
    elevator->displayState("Already stopped (doors open)");
}

void StatePattern()
{
	std::cout << std::string(13, '-') << " State Pattern " << std::string(13, '-') << std::endl;

    Elevator elevator;

    elevator.openDoors(); // 停止 -> 开门
    elevator.closeDoors();// 开门 -> 停止
    elevator.move();      // 停止 -> 运行
    elevator.move();      // 运行中
    elevator.stop();      // 运行 -> 停止
    elevator.openDoors(); // 停止 -> 开门
    elevator.move();      // 尝试在开门状态下移动(错误)
}
组件对应关系
  • ElevatorState → 状态接口
  • StoppedState/MovingState/OpenState → 具体状态
  • Elevator → 上下文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值