当前位置: 首页 > news >正文

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);               //当前模式需要操作的状态
}

相关文章:

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

上图为例&#xff0c;按上述两种方式实现的模式跳转&#xff0c;如果在原先的三种模式之间再增加多一种模式&#xff0c;就会引起每个模式都会要求改变&#xff0c;并且逻辑混乱&#xff0c;因此更改模式为桥接中介者访问&#xff0c;将抽象和实现分离&#xff0c;实现之间采用…...

【SpringCloud】Ribbon负载均衡原理、负载均衡策略、饥饿加载

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Ribbon 一、 Ribbon负载均衡原理1.1 负载均…...

亘古难题——前端开发or后端开发

一、引言 前端开发 前端开发是创建WEB页面或APP等前端界面呈现给用户的过程&#xff0c;通过HTML&#xff0c;CSS及JavaScript以及衍生出来的各种技术、框架、解决方案&#xff0c;来实现互联网产品的用户界面交互。 前端开发从网页制作演变而来&#xff0c;名称上有很明显的时…...

Notepad++提取含有特定字符串的行

ctrl M快捷键&#xff0c;进入"标记" 页面 标记所在行–循环查找-- 正则表达式 – 输入关键字 – 全部标记 – Copy Marked Text 关键字格式如下&#xff1a; .*关键字.*ctrl v&#xff0c;粘贴即可。...

host配置

配置host文件的作用主要是用于自定义域名与IP地址之间的映射关系。Host文件是一个操作系统用于将人类可读的域名&#xff08;例如&#xff1a;www.example.com&#xff09;映射到IP地址&#xff08;例如&#xff1a;192.168.1.1&#xff09;的文件。当你在浏览器中输入一个网址…...

```,```中间添加 # + 空格 + 空行后遇到的底部空行出错,书接上回,处理空行

【python查找替换&#xff1a;查找空行&#xff0c;空行前后添加&#xff0c;中间添加 # 空格 空行后遇到的第1行文字&#xff1f; - CSDN App】http://t.csdnimg.cn/QiKCV def is_blank(line):return len(line.strip()) 0txt 时间戳&#xff1a; ("%Y-%m-%d %H:%M:…...

Unity官方文档中关于内存管理的翻译(2021.3)

原文:Memory in Unity - Unity 手册 Unity内存管理 为了确保您的应用程序运行时没有性能问题&#xff0c;了解Unity如何使用和分配内存非常重要。本文档的这一部分解释了Unity中内存是如何工作的&#xff0c;适用于希望了解如何提高应用程序内存性能的读者。 Unity使用三个内…...

点云处理开发测试题目 完整解决方案

点云处理开发测试题目 文件夹中有一个场景的三块点云数据,单位mm。是一个桌子上放了一个纸箱,纸箱上有四个圆孔。需要做的内容是: 1. 绘制出最小外接立方体,得到纸箱的长宽高值。注意高度计算是纸箱平面到桌子平面的距离。 2. 计算出纸箱上的四个圆的圆心坐标和半径,对圆…...

TensorRT的结构

Builder&#xff08;网络原数据&#xff09;&#xff1a;模型搭建的入口&#xff0c;网络的tensorRT内部表示以及可执行程序引擎都是由该对象的成员方法生成的 BuiderConfig&#xff08;网络原数据的选项&#xff09;&#xff1a;负责设置模型的一些参数&#xff0c;如是否开始…...

python对excel数据表进行数据清洗

当拿到excel表&#xff0c;使用python对excel操作前&#xff0c;第一件事情是对excel表的数据进行数据清洗。 数值是否有空值&#xff0c;是否有重复的数据&#xff0c;把以上2个问题解决完成以后&#xff0c;才是对数据真正操作的开始。 1、使用pandans读取数据 2、判断exce…...

95、Spring Data Redis 之使用RedisTemplate 实现自定义查询 及 Spring Data Redis 的样本查询

Spring Data Redis 之使用RedisTemplate 实现自定义查询 Book实体类 原本的接口&#xff0c;再继承我们自定义的接口 自定义查询接口----CustomBookDao 实现类&#xff1a;CustomBookDaoImpl 1、自定义添加hash对象的方法 2、自定义查询价格高于某个点的Book对象 测试&a…...

jdbc(DriverManager+Connection+Statement+ResultSet)+SQL注入+开启预编译+数据连接池

1 JDBC概念 JDBC 就是使用Java连接并操作数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 2 JDBC优势 可随时替换底层数据库&#xff0c;访问数据库的Java代码基本不变 以后编写操作数据库的代码只需要面向JDBC&#xff08;接口&#xf…...

NoSQL之 Redis命令工具及常用命令

目录 1 Redis 命令工具 1.1 redis-cli 命令行工具 1.2 redis-benchmark 测试工具 2 Redis 数据库常用命令 2.1 set&#xff1a;存放数据&#xff0c;命令格式为 set key value 2.2 get&#xff1a;获取数据&#xff0c;命令格式为 get key 2.3 keys 命令可以取符合规则的…...

多线程(线程互斥)

抢票代码编写 学习了前面有关线程库的操作后&#xff0c;我们就可以模拟抢票的过程 假设我们创建四个线程&#xff0c;分别代表我们的用户 然后设定总票数为1000张&#xff0c;四个线程分别将进行循环抢票操作&#xff0c;其实就是循环对票数进行打印&#xff0c;并进行对应的…...

使用 html2canvas 和 jspdf 将页面转 pdf,同时解决当页面过长时,页面白屏问题

代码如下&#xff0c;直接粘贴复制即可&#xff0c;代码中 jspdf 是全局引入&#xff0c;你可以自己局部引入 别人使用标签的方式来显示 base64&#xff0c;但是当页面过长时&#xff0c;base64 大小过大会导致页面解析异常&#xff0c;显示白屏 import html2canvas from html2…...

【Python 千题 —— 基础篇】今年几岁啦

题目描述 题目描述 介绍自己的年龄。请使用 input 函数读入一个整数&#xff0c;表示自己的年龄&#xff0c;然后程序将自动生成介绍自己年龄的英文语句。 输入描述 输入一个整数&#xff0c;表示自己的年龄。 输出描述 程序将生成一个英文语句&#xff0c;以介绍自己的年…...

git push 失败 shallow update not allowed

问题描述&#xff1a; ~/OK62xx-linux-sdk/OK62xx-linux-kernel$ git push origin master Counting objects: 83919, done. Delta compression using up to 144 threads. Compressing objects: 100% (75697/75697), done. Writing objects: 100% (83919/83919), 232.41 MiB | …...

uniapp 在uni.scss 根据@mixin定义方法 、通过@include全局使用

在官方文档中提及到uni.scss中变量的使用&#xff0c;而我想定义方法&#xff0c;这样写css样式更方便 一、官方文档的介绍 根据官方文档我知道&#xff0c;在这面定义的变量全局都可使用。接下来我要在这里定义方法。 二、在uni.scss文件中定义方法 我在uni.scss文件中定义了…...

C++ 类和对象(一)

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完 成。 …...

rust函数

一 、函数定义 &#xff08;一&#xff09;格式 使用fn关键字 fn是 function 的缩写 1.无返回值的 fn 函数名 ( [paraname: type]... ) {函数体 }参数必须声明参数名称和类型 函数定义时指定的参数叫做 形参。调用时传递给函数的参数叫做 实参。 例子 fn another_function(…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...