C++实现状态模式

embedded/2025/2/9 10:14:32/

首先上代码:

#include <iostream>
#include <memory>class Context;class State {
public:virtual void Handle(Context * context) = 0;		//纯虚函数virtual ~State() = default;				//虚析构函数
};//创建状态A
class ConcreateStateA : public State{
public:virtual void Handle(Context* context);};//创建状态B
class ConcreateStateB : public State {
public:virtual void Handle(Context* context);};//上下文类
class Context {
public:Context(std::shared_ptr<State> state) :m_state(state) {};//请求操作void request() {if (m_state) {m_state->Handle(this);			//使用委托,调用具体状态}}//改变状态void changeState(std::shared_ptr<State> state) {this->m_state = state;		}//展示当前IDvoid showID() {std::cout << "当前ID是 " << id << std::endl;}private:std::shared_ptr<State> m_state;int id = 10;
};int main() {std::shared_ptr<State> stateA = std::make_shared<ConcreateStateA>();		//状态Astd::shared_ptr<State> stateB = std::make_shared<ConcreateStateB>();		//状态B//创建上下文并设置状态std::shared_ptr<Context> m_context = std::make_shared<Context>(stateA);			//创建上下文m_context->request();//切换状态m_context->changeState(stateB);												//切换状态Bm_context->request();return 0;
}inline void ConcreateStateA::Handle(Context* context) {std::cout << "当前是状态A" << std::endl;context->showID();
}inline void ConcreateStateB::Handle(Context* context) {std::cout << "当前是状态B" << std::endl;context->showID();
}

 然后是UML图:

        context 中使用委托将自身传递给state,然后根据状态的不同,调用不同的状态对象,然后执行后面的状态。

        因为context中的change函数中留的是接口函数state,所以如果要添加新的状态,可以直接添加一个CpncreateStateC状态,然后执行这个状态的中相应的操作。同时因为前面已经使用委托将context自身传递给了State的派生类,所以只要留好公有方法就可以很方便的访问原本的数据。

        最后还有一点,在使用委托的时候,因为是传递this指针,所以就不需要再handle()函数接口中传递智能指针形式了。

此文乃录状态模式之学,并附己之心得,以备后日查阅。原文链接如下。
C++设计模式——状态模式 - Ring_1992 - 博客园


http://www.ppmy.cn/embedded/160779.html

相关文章

QT通过setProperty设置不同QSS样式

如上切换效果就是通过setProperty来实现切换不同颜色的。 实现以上效果第一步&#xff0c;需要在QSS中做属性处理。 QLabel{color:red;} QLabel[status"1"]{color:black;} QLabel[status"2"]{color:white;} QLabel[status"3"]{color:blue;} QLa…

线性dp-建造房屋

问题描述 小蓝和小桥是两位年轻的建筑师&#xff0c;他们正在设计一座新的城市。 在这个城市中&#xff0c;有 N 条街道&#xff0c;每条街道上都有 M 个位置可以建造房屋&#xff08;一个位置只能建造一个房屋&#xff09;。建造一个房屋的费用为 1 元&#xff0c;小蓝和小桥…

DeepSeek在FPGA/IC开发中的创新应用与未来潜力

随着人工智能技术的飞速发展&#xff0c;以DeepSeek为代表的大语言模型&#xff08;LLM&#xff09;正在逐步渗透到传统硬件开发领域。在FPGA&#xff08;现场可编程门阵列&#xff09;和IC&#xff08;集成电路&#xff09;开发这一技术密集型行业中&#xff0c;DeepSeek凭借其…

2024最新版Java学习路线图--Java语言进阶重点知识

局部内部类的使用 匿名内部类的使用 匿名内部类在开发中的应用 常用API Math类及其常用方法 System类及其常用方法 Object类的toString()和equals()方法 Arrays类及其常用方法 冒泡排序的原理分析及代码实现 基本类型的包装类 自动拆箱和自动装箱 日期Date类型及其常…

Windows图形界面(GUI)-QT-C/C++ - QT Dock Widget

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 工具栏 2. 侧边栏 3. 调试窗口 三、常见样式 1. 停靠位置 2. 浮动窗口 3. 可关闭 4. 可移动 四、属性设置 1. 设置内容 2. 获取内容 3. 设置标题 …

ubuntu 22.04 cuda12.x 上 cutensor 1.6.2 版本环境搭建

ubuntu 22.04 cuda12.x 运行 cutensor 1.6.2 sample 1.6.2 是比较久的cutensor 版本&#xff0c;但是nv对新的cuda 平台做了继续支持&#xff0c;故可以在cuda sdk 12上使用cutensor 1.6.2 1&#xff0c;下载libcutensor 1.6.2 下载 cutensor 1.6.2 for all Linux and all …

华为支付-免密支付接入签约代扣场景开发步骤

一、预签约&#xff08;服务器开发&#xff09; 1.开发者按照商户模型调用预直连商户预签约或服务商预签约接口获取preSignNo构建签约信息参数contractStr。 为保证支付订单的安全性和可靠性需要对请求body和请求头PayMercAuth对象内的入参排序拼接进行签名。请参考排序拼接和…

DeepSeek 提示词之角色扮演的使用技巧

老六哥的小提示&#xff1a;我们可能不会被AI轻易淘汰&#xff0c;但是会被“会使用AI的人”淘汰。 在DeepSeek的官方提示库中&#xff0c;有“角色扮演&#xff08;自定义人设&#xff09;”的提示词案例。截图如下&#xff1a; 在“角色扮演”的提示词案例中&#xff0c;其实…