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

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


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_eRunmodem_deque.at(m_eRunmode)->DoWorkDone(RUN);               //当前模式需要操作的状态
}

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

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

相关文章

Ultra-Fast-Lane-Detection-v2 {后处理优化}//参考

采用三次多项式拟合生成的anchor特征点&#xff0c;在给定的polyfit_draw函数中&#xff0c;degree参数代表了拟合多项式的度数。 具体来说&#xff0c;当我们使用np.polyfit函数进行数据点的多项式拟合时&#xff0c;我们需要指定一个度数。这个度数决定了多项式的复杂度。例…

JProfiler14.0(Java开发分析)

JProfiler是一款专业的Java应用程序性能分析工具&#xff0c;可帮助开发人员识别和解决Java应用程序中的性能问题。JProfiler支持Java SE、Java EE和Android平台&#xff0c;提供了多种分析选项&#xff0c;包括CPU分析、内存分析和线程分析等。 使用JProfiler&#xff0c;开发…

【设计模式】使用原型模式完成业务中“各种O”的转换

文章目录 1.原型模式概述2.浅拷贝与深拷贝2.1.浅拷贝的实现方式2.2.深拷贝的实现方式 3.结语 1.原型模式概述 原型模式是一种非常简单易懂的模型&#xff0c;在书上的定义是这样的&#xff1a; Specify the kinds of objects to create using a prototypical instance,and cre…

C语言打印菱形

一、运行结果图 二、源代码 # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int line 0;int i 0;int j 0;//获取变量值&#xff1b;scanf("%d", &line);//循环打印上半部分&#xff1b;for (i 0; i <…

Spring在业务中常见的使用方式

目录 通过IOC实现策略模式 通过AOP实现拦截 通过Event异步解耦 通过Spring管理事务 通过IOC实现策略模式 很多时候&#xff0c;我们需要对不同的场景进行不同的业务逻辑处理举个例子&#xff0c;譬如不同的场景需要不同支付方式&#xff0c;普通的逻辑是使用if-else&#x…

阿里云对象存储OSS SDK的使用

官方文档 https://help.aliyun.com/zh/oss/developer-reference/java 准备工作 windows安装好JDK&#xff0c;这里使用JDK1.8为例 windows安装好IDEA&#xff0c;这里使用IDEA2022 登录阿里云控制台&#xff0c;通过免费试用OSS或开通OSS 步骤 配置访问凭证 有临时和长期…

文化主题公园旅游景点3d全景VR交互体验加深了他们对历史文化的认知和印象

如今&#xff0c;沉浸式体验被广泛应用于文旅行业&#xff0c;尤其是在旅游演艺活动中。在许多城市&#xff0c;沉浸式旅游演艺活动已成为游客“必打卡”项目之一。因其独特体验和强互动性&#xff0c;这类演艺活动不仅吸引了外地游客&#xff0c;也吸引了本地观众。 随着信息化…

解决: 使用html2canvas和print-js打印组件时, 超出高度出现空白页

如果所示&#xff1a;当我利用html2canvas转换成图片后, 然后使用print-js打印多张图片, 第一张会出现空白页 打印组件可参考这个: Vue-使用html2canvas和print-js打印组件 解决: 因为是使用html2canvas转换成图片后才打印的, 而图片是行内块级元素, 会有间隙, 所以被挤下去了…

大数据——Spark Streaming

是什么 Spark Streaming是一个可扩展、高吞吐、具有容错性的流式计算框架。 之前我们接触的spark-core和spark-sql都是离线批处理任务&#xff0c;每天定时处理数据&#xff0c;对于数据的实时性要求不高&#xff0c;一般都是T1的。但在企业任务中存在很多的实时性的任务需求&…

Ubuntu22.04.3安装教程

虚拟机系列文章 VMware Workstation Player 17 免费下载安装教程 VMware Workstation 17 Pro 免费下载安装教程 windows server 2012安装教程 Ubuntu22.04.3安装教程 FTP服务器搭建 Ubuntu22.04.3安装教程 虚拟机系列文章前言Ubuntu22.04.3安装&#xff08;图文&#xff09; 前…

Linux系列---【查看mac地址】

查看mac地址命令 查看所有网卡命令 nmcli connection show 查看物理网卡mac地址 ifconfig 删除网卡 nmcli connection delete virbr0 禁用libvirtd.service systemctl disable libvirtd.service 启用libvirtd.service systemctl enable libvirtd.service

软件工程与计算总结(五)软件需求基础

本帖介绍软件需求涉及的诸多基本概念&#xff0c;通过对这些概念的阐述&#xff0c;剖析软件需求的来源、层次、类别、作用等重要知识~ 目录 ​编辑 一.引言 二.需求工程基础 1.简介 2.活动 3.需求获取 4.需求分析 5.需求规格说明 6.需求验证 7.需求管理 三.需求基…

【动手学深度学习】课程笔记 00-03 深度学习介绍及环境配置

目录 00-01 课程安排 02 深度学习介绍 深度学习实际应用的流程 完整的故事 03 环境配置 00-01 课程安排 1. 学习了这门课&#xff0c;你将收获什么&#xff1f; 深度学习的经典和最新模型&#xff1a;LeNet&#xff0c;ResNet&#xff0c;LSTM&#xff0c;BERT&#xff1…

JS-前端在dom中预览pdf等文件

1、将pdf等文件显示到dom元素中预览 pdf文件可以是blob、url、file类型等只要使用URL.createObjectURL(file)全部转为URL即可使用无需借助任何插件&#xff0c;只需要使用<object></object>标签即可实现 1.1、html <template><div class"home"…

Vue中如何进行分布式日志收集与日志分析(如ELK Stack)

在Vue中实现分布式日志收集与日志分析&#xff08;使用ELK Stack&#xff09; 日志收集和分析在现代应用程序中是至关重要的&#xff0c;它们可以帮助开发人员监视和诊断应用程序的行为&#xff0c;从而提高应用程序的稳定性和性能。ELK Stack&#xff08;Elasticsearch、Logs…

软件测试面试之问——角色扮演

作为软件测试工程师&#xff0c;在求职面试中经常会被问到这样一个问题&#xff1a;你认为测试工程师在企业中扮演着什么样的角色呢&#xff1f; 某度百科是这样概括的&#xff1a;“软件测试工程师在一家软件企业中担当的是‘质量管理’角色&#xff0c;及时发现软件问题并及…

Arcgis快速计算NDVI

Arcgis快速计算NDVI 一、问题描述 如何使用Arcgis像ENVI一样波段计算NDVI的值&#xff0c;事实上&#xff0c;Arcgis更快速一些。 二、操作步骤 首先准备好影像 打开窗口-影像分析 点击左上角 点击确定 &#xff08;发现自己使用的遥感影像不对劲&#xff0c;是计算好了…

flutter开发实战-inappwebview实现flutter与Javascript的交互JSBridge

flutter开发实战-inappwebview实现flutter与Javascript的交互JSBridge 在使用webview中&#xff0c;需要实现flutter与Javascript交互&#xff0c;在使用webview_flutter插件的时候&#xff0c;整理了一下webview与Javascript的交互JSBridge&#xff0c;具体可以查看 https:/…

九大高效的前端测试工具与框架

前言&#xff1a; 在每个Web应用程序中&#xff0c;作为用户直接可见的应用程序外观&#xff0c;“前端”包括&#xff1a;图形化的用户界面、相应的功能、及其整体站点的可用性。我们可以毫不夸张地说&#xff1a;如果前端无法正常工作&#xff0c;您将无法“拉新”网站的潜在…

端粒/端粒酶生信切入点,6+端粒酶+泛癌+甲基化+实验。

今天给同学们分享一篇端粒酶泛癌甲基化实验的生信文章“Genomic, epigenomic, and transcriptomic signatures for telomerase complex components: a pan‐cancer analysis”&#xff0c;这篇文章于2022年10月31日发表在Mol Oncol期刊上&#xff0c;影响因子为6.6。 激活端粒酶…