状态模式 (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→ 上下文
1169

被折叠的 条评论
为什么被折叠?



