一、状态模式是什么?
状态模式是一种行为型的软件设计模式,当一个对象的内在状态改变时,其行为也随之改变。就像玩游戏的时候,不同的buff状态,角色会有不同的伤害、技能等等。
当控制一个对象状态的条件表达式过于复杂时,很适合用该模式,将复杂的判断逻辑转移到表示不同状态的系列类中,能将逻辑大大简化。
状态模式的优点:
- 良好封装性。每个状态的行为被封装到对应类中。
- 便于维护。减少了if else或switch语句的出现,适用于条件判断复杂的场景。
- 良好扩展性。添加状态更便捷。
状态模式的缺点:
- 状态数量增加,类数量也会增加,对开发者要求较高。
- 状态少时,应用状态模式会显得冗余。
二、状态模式
2.1 结构图
客户端即Main主函数,灯不同状态有不同行为,状态还可切换。
2.2 代码示例
场景描述:灯初始关闭,将其打开,再将其关闭。
//State.h /****************************************************/ #pragma once #include <iostream> using namespace std; class Lamp; // 抽象状态类 class State { public: // 析构函数 virtual ~State() {} // 操作函数 virtual void handle(Lamp& context) = 0; }; // 具体状态类-开 class StateOn : public State { public: // 操作函数 virtual void handle(Lamp& context); }; // 具体状态类-关 class StateOff : public State { public: // 操作函数 virtual void handle(Lamp& context); }; // 灯 class Lamp { public: // 构造函数,默认状态关闭 Lamp() : m_state(new StateOff()){} // 析构函数 ~Lamp(); // 设置状态 void setState(State* state); // 请求 void request(); private: State* m_state; };
//State.cpp /****************************************************/ #include "State.h" // 操作函数 void StateOn::handle(Lamp& context) { cout << "当前状态:打开" << endl; cout << "执行操作:关闭" << endl; context.setState(new StateOff()); } // 操作函数 void StateOff::handle(Lamp& context) { cout << "当前状态:关闭" << endl; cout << "执行操作:打开" << endl; context.setState(new StateOn()); } // 析构函数 Lamp::~Lamp() { if (m_state) { delete m_state; m_state = nullptr; } } // 设置状态 void Lamp::setState(State* state) { if (m_state) { delete m_state; m_state = nullptr; } m_state = state; } // 请求 void Lamp::request() { m_state->handle(*this); }
//main.cpp /****************************************************/ #include <iostream> #include <string> #include "State.h" using namespace std; int main() { Lamp lamp; lamp.request(); // 操作灯 lamp.request(); // 操作灯 return 0; }
程序结果如下。
注意new出来的数据,别忘了delete。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对状态模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解状态模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!