c++如何实现状态模式 c++设计模式之State【实例】

25次阅读

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

c++如何实现状态模式 c++设计模式之State【实例】

状态模式在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完整定义,可用前向声明+指针)。

text=ZqhQzanResources