状态模式通过将状态封装为独立类并由Context持状态接口指针实现,核心是剥离状态逻辑、避免分支;定义State抽象基类含纯虚handle函数,具体状态类实现handle并可调用context.setState切换状态。

状态模式在C++中通过将每个状态封装为独立类、让上下文(Context)持有一个状态接口指针来实现,核心是把状态相关的逻辑从Context中剥离,避免大量if-else或switch分支。
定义状态接口(State)
所有具体状态类都继承自这个抽象基类,声明处理请求的虚函数:
class State {
public:
virtual ~State() = default;
virtual void handle(Context& context) = 0; // 核心行为,可传入context以便切换状态
};
实现具体状态类
每个状态类只关注自身职责,内部可调用context.setState()触发状态转移:
class ConcreteStateA : public State {
public:
void handle(Context& context) override {
std::cout << "当前状态:A\n";
// 满足条件时切换到B
if (someCondition()) {
context.setState(std::make_unique());
}
}
private:
bool someCondition() { return true; }
};
class ConcreteStateB : public State {
public:
void handle(Context& context) override {
std::cout << "当前状态:B\n";
// 可切回A或其他状态
context.setState(std::make_unique());
}
};
构建上下文类(Context)
Context持有当前状态的智能指针,提供统一接口供外部调用,并支持运行时更换状态:
立即学习“C++免费学习笔记(深入)”;
class Context {
private:
std::unique_ptr state_;
public:
explicit Context(std::unique_ptr initial_state)
: state_(std::move(initial_state)) {}
void setState(std::unique_ptr new_state) {
state_ = std::move(new_state);
}
void request() {
if (state_) {
state_->handle(*this); // 传入*this便于状态内部修改context
}
}
};
使用示例
客户端无需关心内部状态细节,只需操作Context:
int main() {
Context ctx = Context(std::make_unique());
ctx.request(); // 输出:当前状态:A → 自动切到B
ctx.request(); // 输出:当前状态:B → 自动切回A
ctx.request(); // 输出:当前状态:A
return 0;
}
关键点:状态切换由状态自身或Context控制;推荐用std::unique_ptr管理状态生命周期;避免循环依赖(如State头文件中不要直接包含Context完整定义,可用前向声明+指针)。











