状态模式通过封装不同状态的行为并实现状态间切换,使对象在运行时改变行为。它由Context、State和ConcreteState三部分组成,避免了冗长的条件判断,提升了代码可维护性与扩展性,适用于状态多且转换复杂的场景。
状态模式(State Pattern)是C++中常用的行为型设计模式之一,它允许对象在内部状态改变时改变其行为,仿佛改变了它的类。这种模式特别适用于一个对象的行为依赖于它的状态,并且状态数量较多、条件判断复杂的情况。
将与特定状态相关的行为封装到独立的状态类中,对象本身持有一个状态对象的引用,当状态变化时,只需切换该引用指向新的状态对象,调用行为时委托给当前状态对象处理。
这样做的好处是避免了大量 if-else 或 switch-case 判断语句,使代码更清晰、易于扩展和维护。
状态模式通常包含三个核心部分:
下面是一个简单的例子,模拟电灯的开关状态:
#includeusing namespace std; // 抽象状态类 class LightState { public: virtual ~LightState() = default; virtual void pressSwitch(class Light* light) = 0; }; // 上下文类 class Light { private: LightState* currentState; public: explicit Light(LightState* state) : currentState(state) {} ~Light() { delete currentState; } void setState(LightState* state) { if (currentState) delete currentState; currentState = state; } void pressSw itch() { currentState->pressSwitch(this); } }; // 具体状态类 - 关闭状态 class OffState : public LightState { public: void pressSwitch(Light* light) override { cout << "Turning on the light.\n"; light->setState(new OnState()); } }; // 具体状态类 - 开启状态 class OnState : public LightState { public: void pressSwitch(Light* light) override { cout << "Turning off the light.\n"; light->setState(new OffState()); } };
使用示例:
int main() {
Light* light = new Light(new OffState());
light->pressSwitch(); // 输出: Turning on the light.
light->pressSwitch(); // 输出: Turning off the light.
light->pressSwitch(); // 输出: Turning on the light.
delete light;
return 0;
}优点:
适用场景:
使用状态模式时需注意以下几点:
基本上就这些。状态模式通过对象组合代替条件判断,让状态变化变得灵活自然,在游戏开发、UI控制、通信协议等场景中非常实用。掌握它能显著提升复杂状态逻辑的代码质量。