设计模式之状态模式(C++)

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、状态模式是什么?

       状态模式是一种行为型的软件设计模式,当一个对象的内在状态改变时,其行为也随之改变。就像玩游戏的时候,不同的buff状态,角色会有不同的伤害、技能等等。

       当控制一个对象状态的条件表达式过于复杂时,很适合用该模式,将复杂的判断逻辑转移到表示不同状态的系列类中,能将逻辑大大简化。

       状态模式的优点:

  1. 良好封装性。每个状态的行为被封装到对应类中。
  2. 便于维护。减少了if else或switch语句的出现,适用于条件判断复杂的场景。
  3. 良好扩展性。添加状态更便捷。

      状态模式的缺点:

  1. 状态数量增加,类数量也会增加,对开发者要求较高。
  2. 状态少时,应用状态模式会显得冗余。

二、状态模式

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。

三、总结

       我尽可能用较通俗的话语和直观的代码例程,来表述我对状态模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解状态模式。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

猜你喜欢

转载自blog.csdn.net/zhaitianbao/article/details/130257608