c++桥接模式,中介者模式应用实现状态跳转

news2024/11/17 10:27:53

上图为例,按上述两种方式实现的模式跳转,如果在原先的三种模式之间再增加多一种模式,就会引起每个模式都会要求改变,并且逻辑混乱,因此更改模式为桥接+中介者访问,将抽象和实现分离,实现之间采用中介者实现模式之间的通信,或者在实现中去管理每个模式之间的通信。方便后续扩展:


class MaWorkState;
typedef enum _childMastate {
	RUN = 0,
	STOP,
	RUNNING,
	STATE_QTY,
}childMastate;
typedef bool(MaWorkState::* Statefunc)(void);

typedef std::function<bool(void)> pcb;
class StateSwitching {
public:
	StateSwitching() {};

	virtual void DoSate()
	{
		while (!m_pcontext.empty())
		{
			m_deque.at(m_pcontext.at(0));
			m_pcontext.pop_front();
		}
	}
	template<typename Ty>
	void PushEvent(Ty ev)
	{
		m_pcontext.push_back(ev);
	}
protected:
	std::deque<int> m_pcontext;
	std::deque<pcb> m_deque;
	ModuleNormalOutput* m_ModuleNormalOutput;
	DdsWaveHandle* m_pDds;
};


/*  
class mediator;

class StateSwitching {
public:
	StateSwitching() {};
	virtual void GenMediator(mediator* media) { m_mediator = media; };
	virtual bool ReleaseMode() {};   //这样:不管增加多少模式,都只是实现自己的两个接口就可以,但必须将模式之间的交互隔离,模式之间不产生联系,如果出现关联,抽线一层(使用一个中介者实现关联)
	virtual bool CtrlMode() {};
protected:
	std::deque<int> m_pcontext;
	std::deque<pcb> m_deque;
	mediator* m_mediator;
};

class mediator {
public:
	virtual void realese(StateSwitching*child1, StateSwitching*child2) =0;
	virtual void ctrl(StateSwitching* child1, StateSwitching* child2) =0;
};

class GenMediatorChild :public mediator {
public:
	GenMediatorChild():m_swith1(NULL), m_swith2(NULL) {};
	virtual void realese(StateSwitching* child1, StateSwitching* child2) {};
	virtual void ctrl(StateSwitching* child1, StateSwitching* child2) {};

	StateSwitching* m_swith1;
	StateSwitching* m_swith2;
};
*/

class NormalStateSwitching :public StateSwitching {
public:
	typedef enum NormalState
	{
		LIST_TO_NORMAL = 0,
		SOLAR_TO_NORMAL,
	};
	NormalStateSwitching() {
		m_deque.resize(4);
		//m_deque.push_back(std::bind(&NormalStateSwitching::OnListtoNormal,this));
		m_deque.at(LIST_TO_NORMAL) = std::bind(&NormalStateSwitching::OnListtoNormal, this);
		m_deque.at(SOLAR_TO_NORMAL) = std::bind(&NormalStateSwitching::OnListtoNormal, this);
	};
	bool OnListtoNormal(void)
	{
		return true;
	}
	bool OnSolartoNormal(void)
	{
		return true;
	}
};

class SolarStateSwitching :public StateSwitching {   //当增加多一个模式,每一个状态的跳转都需要增加,考虑怎么优化  //换一种实现方式:将自己正在执行的状态在切换模式的时候,针对自己的状态释放
													//需要执行的模式做加载,那么每一个模式就只有release,ctrl接口
public:
	typedef enum SolarState
	{
		LIST_TO_SOLAR = 0,
		NORMAL_TO_SOLAR,
	};
	SolarStateSwitching() {
		m_deque.resize(4);
		//m_deque.push_back(std::bind(&NormalStateSwitching::OnListtoNormal,this));
		m_deque.at(LIST_TO_SOLAR) = std::bind(&SolarStateSwitching::OnListtoSolar, this);
		m_deque.at(NORMAL_TO_SOLAR) = std::bind(&SolarStateSwitching::OnNormaltoSolar, this);
	};
	bool OnListtoSolar(void)
	{
		return true;
	}
	bool OnNormaltoSolar(void)
	{
		return true;
	}
};

class MaWorkState
{
public:
	MaWorkState(StateSwitching* state) :m_StateSwitching(state) {
		m_FuncState[RUN] = &MaWorkState::start;
		m_FuncState[STOP] = &MaWorkState::stop;
		m_FuncState[RUNNING] = &MaWorkState::running;
	};
	~MaWorkState() {};
	virtual bool DoWorkPrepare(int smode) {
		return true;
	}
	virtual bool DoWorkDone(childMastate py) {
		m_StateSwitching->DoSate();
		(this->*m_FuncState[py])();
		return true;
	}
protected:
	virtual bool start(void) = 0;
	virtual bool stop(void) = 0;
	virtual bool running(void) = 0;
	ModuleNormalOutput* m_ModuleNormalOutput;
	DdsWaveHandle* m_pDds;
	RUN_MODE m_mode;
public:
	Statefunc m_FuncState[STATE_QTY];
	StateSwitching* m_StateSwitching;
};

class MaNormalStart :public MaWorkState
{
public:
	MaNormalStart(StateSwitching* state) :MaWorkState(state) {
		m_mode = NORM_MODE;
	};
	virtual bool DoWorkPrepare(RUN_MODE smode) {          //当前用户切换了工作模式       
		if(m_mode!=smode)
			m_StateSwitching->PushEvent<NormalStateSwitching::NormalState>(NormalStateSwitching::NormalState(smode));
		return true;
	}
protected:
	virtual bool start(void) {
		printf("normalstart\n"); return true;
	};
	virtual bool stop(void) { return true; };
	virtual bool running(void) { return true; };
private:
	
};

class SolarStart :public MaWorkState
{
public:
	SolarStart(StateSwitching* state) :MaWorkState(state) {
		m_mode = SOLAR_MODE;
	};
	virtual bool DoWorkPrepare(RUn_MODE smode) { return true; }
protected:
	virtual bool start(void) {
		printf("SolarStart\n"); return true;
	};
	virtual bool stop(void) { return true; };
	virtual bool running(void) { return true; };
private:
	
};

class ListStart :public MaWorkState
{
public:
	ListStart(StateSwitching* state) :MaWorkState(state) {
		m_mode = LIST_MODE;
	};
	virtual bool DoWorkPrepare(RUN_MODE smode) { return true; }
protected:
	virtual bool start(void) {
		printf("SolarStart\n"); return true;
	};
	virtual bool stop(void) { return true; };
	virtual bool running(void) { return true; };
private:
	
	WAVE_LIB_TYPE m_eLibType;
};


int main()
{
	std::deque<MaWorkState*> m_deque;
	m_deque.push_back(new MaNormalStart(new NormalStateSwitching()));
	m_deque.push_back(new SolarStart(new SolarStateSwitching()));
	m_deque.push_back(new ListStart(new ListStateSwitching()));
    //增加多一个cell模式,只需要增加CellStart,和CellStateSwitching类,用户调用接口不变
    //m_deque.push_back(new CellStart(new CellStateSwitching()));

	m_deque.at(m_eRunmode)->DoWorkPrepare(m_SysCtrlMode);  //用户设置模式m_SysCtrlMode,上一次记录的模式m_eRunmode
	m_deque.at(m_eRunmode)->DoWorkDone(RUN);               //当前模式需要操作的状态
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1073235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32单片机裸机程序怎么处理大量网络数据?

STM32单片机裸机程序怎么处理大量网络数据? 无论是在中断中处理数据&#xff0c;还是在主循环里处理数据&#xff0c;你用于处理数据的时间是不变的。 你可以算一下&#xff0c;处理数据的时间&#xff08;速率&#xff09;和单片机的处理能力相差有多大&#xff0c;单片机是…

Android原生实现控件圆角方案(API28及以上)

Android控件的圆角效果的实现方式有很多种&#xff0c;这里介绍一下另一种Android原生的圆角实现方案&#xff08;API28及以上&#xff09;。 我们利用ShapeAppearanceModel、MaterialShapeDrawable来实现一个圆角/切角的Button。 实现效果如下图 我们在为控件添加阴影的基础上…

【软考设计师】S01 数据结构 E01 线性结构 P01 线性表

线性表 前言——线性结构线性表线性表的定义线性表的特点线性表的存储结构顺序存储链式存储单链表双向链表循环链表静态链表 前言——线性结构 线性结构是一种基本的数据结构&#xff0c;主要用于对客观世界中具有单一前驱和后继的数据关系进行描述。线性结构的特点是数据元素…

漏刻有时数据可视化Echarts组件开发(43)水球图svg温度计动画

SVG是一种用XML定义的语言&#xff0c;用来描述二维矢量及矢量/栅格图形。具体来说&#xff0c;SVG图形是可伸缩的矢量图形&#xff0c;其图像质量不会因放大或改变尺寸而损失。 在SVG中&#xff0c;可以创建和修改图像、对图像进行搜索和索引、对其进行脚本化或压缩。此外&am…

【网络安全入门】学习网络安全必须知道的100 个网络基础知识

前言 话不多说&#xff0c;完整的资料已经上传至CSDN官方&#xff0c;需要的可以点击链接自取【282G】网络安全&黑客技术零基础到进阶全套学习大礼包&#xff0c;免费分享&#xff01; 1 什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备…

Zabbix“专家坐诊”第206期问答汇总

问题一 Q&#xff1a;老师&#xff0c;我想配置一下监控项和触发器&#xff0c;目前我想要三个&#xff0c;内存的使用情况百分比、磁盘的剩余多少G、CPU的使用情况百分比&#xff0c;用自带的模板修改&#xff0c;该怎么做&#xff1f; A&#xff1a;可以用100减去内置键值cp…

ICCV 2023 | 当尺度感知调制遇上Transformer,会碰撞出怎样的火花?

作者 &#xff5c; AFzzz 1 文章介绍 近年来&#xff0c;基于Transformer和CNN的视觉基础模型取得巨大成功。有许多研究进一步地将Transformer结构与CNN架构结合&#xff0c;设计出了更为高效的hybrid CNN-Transformer Network&#xff0c;但它们的精度仍然不尽如意。本文介绍…

java spring cloud 工程企业管理软件-综合型项目管理软件-工程系统源码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

基于ssm的少儿编程网上报名系统+vue【附PPT|万字文档(LW)和搭建文档】

主要功能 前台登录&#xff1a; 注册用户&#xff1a;用户名、密码、姓名、联系电话 用户&#xff1a; ①首页、课程信息推荐、课程资讯、查看更多 ②课程详情、点我收藏、购买、评论、留言反馈 ③个人中心、修改用户名、密码、姓名、性别、头像、手机号、我的收藏等 后台登录…

Pycharm调试时,到达断点后,一直connected

Pycharm调试时&#xff0c;到达断点后&#xff0c;一直connected&#xff0c;画了一上午时间&#xff0c;最后发现是因为我dataloader使用的是多进程&#xff0c; 选中Gevent兼容后解决。

九方云学堂学员告诉你学习可以掌握哪些内容

在当前的股票市场环境下,存在许多不确定性因素和风险。虽然不少新兴行业的诞生,为投资者带来了更多的投资机会,但是风险同样会与日俱增。在这种情况下,作为一名投资者,想要在不断变化的市场环境中,提高投资胜率,做到复利,完整、科学的投资策略,成为了越来越多投资者关注的焦点。…

软信天成:物料主数据的标准管理

在制造企业加工生产的过程中&#xff0c;物料管理尤为重要。严格的原料管控将直接影响产品的品质、工作效率以及制造成本。相较于其他主数据&#xff0c;物料主数据是一种最复杂、数据量最大也是最关键的主数据&#xff0c;其准确性和规范程度将直接决定系统是否顺畅运行。 因此…

Python教程:方法重载

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 方法重载 方法重载在Python中起着关键作用。 方法有时接受零参数&#xff0c;有时接受一个或多个参数。 当我们以不同的方式调用同一个方法时&#xff0c;这就被称为方法…

Windows mysql 5.7 msi版、mysql 8.0 msi版下载、安装教程,附详细图文

大家好&#xff0c;今天为大家带来的是 mysql 5.7 msi &#xff0c; MySql 8.0 版本的下载、安装教程&#xff0c;附详细图文。本文以 5.7 版本为例子&#xff0c;帮助大家讲解。希望对大家有所帮助 文章首发地址 一、下载地址 这里提供一下 CSDN 镜像下载地址&#xff0c;有…

ESP-07S进行TCP 通信测试

一&#xff0c;TCP Server 为 AP 模式&#xff0c;TCP Client 为 Station 模式。 这里电脑pc作为TCP Server&#xff0c;ESP-07S作为TCP Client 。 二&#xff0c;电脑端配置。 1&#xff0c;开启热点。 2&#xff0c;转到“设置”&#xff0c;编辑热点信息。 3&#xff0c;关闭…

ROS2 Galactic安装

ROS2 Galactic安装 ROS2 Galactic安装字体编码检查添加ros2仓库到本机安装ROS2系统测试ROS卸载ros2 ROS2 Galactic安装 字体编码检查 安装需要设置本级为UTF-8字体&#xff0c;使用如下指令检查&#xff1a; locale # check for UTF-8sudo apt update && sudo apt …

【C++】空间配置器 allocator:原理及底层解析

文章目录 空间配置器一级空间配置器二级空间配置器1. 内存池2. SGI-STL中二级空间配置器设计 - - 哈希桶3. 二级空间配置器的空间申请 空间配置器的默认选择空间配置器的在封装&#xff1a;添加了数据类型大小空间配置器对象的构造与析构 容器中的 allocator 空间配置器 提到空…

移动办公管理系统低代码解决方案

随着企业数字化转型的加速&#xff0c;人工智能、云计算、大数据等技术应用的愈加广泛&#xff0c;数字化的办公系统在企事业内部编织起一套高效、畅通的信息互联体系&#xff0c;极大推动了企事业单位生产力的发展。 但与此同时&#xff0c;由于需要依赖固定的办公场所和固定…

最值得收藏的顶级专业数据恢复软件列表 [持续更新]

互联网上充斥着很多的数据恢复软件&#xff0c;每个软件都声称自己是最好的。现在该同意谁的观点呢&#xff1f;我们创建了 2023 年顶级专业数据恢复软件列表。下载顶级一流数据恢复专业软件的免费试用版&#xff0c;我们强烈建议用户评估演示版本&#xff0c;然后选择付费版本…

Python 樱花

Python实现樱花 效果图 &#xff08;源码在下面&#xff09; 源码&#xff1a; from turtle import * from random import * from math import *def tree(n, l):pd() # 下笔# 阴影效果t cos(radians(heading() 45)) / 8 0.25pencolor(t, t, t)pensize(n / 3)forward(l…