状态模式通过将状态封装为独立类并由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 << "当前状态:An"; // 满足条件时切换到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 << "当前状态:Bn"; // 可切回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完整定义,可用前向声明+指针)。