1. 状态模式的核心思想与C++实现基础
状态模式是GoF设计模式中最具实战价值的行为型模式之一,它通过将对象的行为委托给代表当前状态的状态对象,使得对象在不同状态下能够表现出不同的行为。在C++中实现状态模式,我们需要先理解几个关键概念:
状态接口(State Interface):定义所有具体状态类必须实现的操作接口。在C++中通常用抽象基类表示:
cpp复制class State {
public:
virtual void handle(Context* context) = 0;
virtual ~State() = default;
};
上下文类(Context):维护当前状态对象的引用,并将行为委托给状态对象:
cpp复制class Context {
State* currentState;
public:
Context(State* state) : currentState(state) {}
void setState(State* state) {
delete currentState; // 释放旧状态
currentState = state;
}
void request() {
currentState->handle(this);
}
~Context() { delete currentState; }
};
具体状态类(Concrete States):实现特定状态下的行为,并可能触发状态转换:
cpp复制class ConcreteStateA : public State {
public:
void handle(Context* context) override {
std::cout << "State A handling request, transitioning to State B\n";
context->setState(new ConcreteStateB());
}
};
class ConcreteStateB : public State {
public:
void handle(Context* context) override {
std::cout << "State B handling request, transitioning back to State A\n";
context->setState(new ConcreteStateA());
}
};
这种基础实现虽然简单,但在实际项目中会面临几个关键挑战:
- 状态转换逻辑分散在各个具体状态类中,难以全局把握状态迁移关系
- 新增状态时需要修改多个现有状态类的转换逻辑
- 状态对象的生命周期管理容易出错(特别是涉及多线程时)
提示:在C++中实现状态模式时,务必注意资源管理。建议使用智能指针(如std::unique_ptr)来管理状态对象,避免手动内存管理带来的风险。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 状态模式的高级应用场景
2.1 复杂工作流引擎的实现
在需要处理复杂业务流程的系统(如订单处理、审批系统)中,状态模式可以优雅地管理各种状态转换。以一个电商订单系统为例:
cpp复制class Order {
OrderState* state;
// 订单其他属性...
public:
enum class Event { PLACED, PAYED, SHIPPED, DELIVERED, CANCELLED };
void handleEvent(Event event) {
state->handle(*this, event);
}
void changeState(std::unique_ptr<OrderState> newState) {
state = std::move(newState);
}
// ...
};
class OrderState {
public:
virtual void handle(Order& order, Order::Event event) = 0;
virtual ~OrderState() = default;
};
class PlacedSt
