设计模式之状态模式(C++)
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
一、状态模式是什么?
状态模式是一种行为型的软件设计模式,当一个对象的内在状态改变时,其行为也随之改变。就像玩游戏的时候,不同的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。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对状态模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解状态模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!