作者:翟天保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。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对状态模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解状态模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!