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

简介: 设计模式之状态模式(C++)

一、状态模式是什么?

      状态模式是一种行为型的软件设计模式,当一个对象的内在状态改变时,其行为也随之改变。就像玩游戏的时候,不同的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。

三、总结

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

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

相关文章
|
2月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
65 0
|
2月前
|
设计模式 算法 C++
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(二)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
30 0
|
2月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
30 1
|
2月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
54 0
|
17天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
17天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
1月前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
29 4
|
2月前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
126 1
|
2月前
|
设计模式 机器学习/深度学习 算法
C++设计模式新篇章:掌握状态委托
C++设计模式新篇章:掌握状态委托
75 0
|
2月前
|
设计模式 算法 C++
从 C++ 优化状态机实现:结合设计模式的实用指南
从 C++ 优化状态机实现:结合设计模式的实用指南
69 1