设计模式之状态模式(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。

三、总结

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

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

相关文章
|
7月前
|
设计模式
设计模式之 State(状态模式)
设计模式之 State(状态模式)
43 0
|
3月前
|
设计模式 Java 测试技术
Java设计模式-状态模式(18)
Java设计模式-状态模式(18)
|
4月前
|
设计模式 网络协议 Java
【十五】设计模式~~~行为型模式~~~状态模式(Java)
文章详细介绍了状态模式(State Pattern),这是一种对象行为型模式,用于处理对象在其内部状态改变时的行为变化。文中通过案例分析,如银行账户状态管理和屏幕放大镜工具,展示了状态模式的应用场景和设计方法。文章阐述了状态模式的动机、定义、结构、优点、缺点以及适用情况,并提供了Java代码实现和测试结果。状态模式通过将对象的状态和行为封装在独立的状态类中,提高了系统的可扩展性和可维护性。
【十五】设计模式~~~行为型模式~~~状态模式(Java)
|
5月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
46 3
|
5月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
62 2
|
5月前
|
设计模式 JavaScript Go
js设计模式【详解】—— 状态模式
js设计模式【详解】—— 状态模式
82 7
|
7月前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
69 2
|
6月前
|
设计模式
状态模式-大话设计模式
状态模式-大话设计模式
|
6月前
|
设计模式 存储
行为设计模式之状态模式
行为设计模式之状态模式
|
7月前
|
设计模式 Go
[设计模式 Go实现] 行为型~状态模式
[设计模式 Go实现] 行为型~状态模式