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++桥接模式,中介者模式应用实现状态跳转
上图为例,按上述两种方式实现的模式跳转,如果在原先的三种模式之间再增加多一种模式,就会引起每个模式都会要求改变,并且逻辑混乱,因此更改模式为桥接中介者访问,将抽象和实现分离,实现之间采用…...
【SpringCloud】Ribbon负载均衡原理、负载均衡策略、饥饿加载
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Ribbon 一、 Ribbon负载均衡原理1.1 负载均…...
亘古难题——前端开发or后端开发
一、引言 前端开发 前端开发是创建WEB页面或APP等前端界面呈现给用户的过程,通过HTML,CSS及JavaScript以及衍生出来的各种技术、框架、解决方案,来实现互联网产品的用户界面交互。 前端开发从网页制作演变而来,名称上有很明显的时…...
Notepad++提取含有特定字符串的行
ctrl M快捷键,进入"标记" 页面 标记所在行–循环查找-- 正则表达式 – 输入关键字 – 全部标记 – Copy Marked Text 关键字格式如下: .*关键字.*ctrl v,粘贴即可。...
host配置
配置host文件的作用主要是用于自定义域名与IP地址之间的映射关系。Host文件是一个操作系统用于将人类可读的域名(例如:www.example.com)映射到IP地址(例如:192.168.1.1)的文件。当你在浏览器中输入一个网址…...
```,```中间添加 # + 空格 + 空行后遇到的底部空行出错,书接上回,处理空行
【python查找替换:查找空行,空行前后添加,中间添加 # 空格 空行后遇到的第1行文字? - CSDN App】http://t.csdnimg.cn/QiKCV def is_blank(line):return len(line.strip()) 0txt 时间戳: ("%Y-%m-%d %H:%M:…...
Unity官方文档中关于内存管理的翻译(2021.3)
原文:Memory in Unity - Unity 手册 Unity内存管理 为了确保您的应用程序运行时没有性能问题,了解Unity如何使用和分配内存非常重要。本文档的这一部分解释了Unity中内存是如何工作的,适用于希望了解如何提高应用程序内存性能的读者。 Unity使用三个内…...
点云处理开发测试题目 完整解决方案
点云处理开发测试题目 文件夹中有一个场景的三块点云数据,单位mm。是一个桌子上放了一个纸箱,纸箱上有四个圆孔。需要做的内容是: 1. 绘制出最小外接立方体,得到纸箱的长宽高值。注意高度计算是纸箱平面到桌子平面的距离。 2. 计算出纸箱上的四个圆的圆心坐标和半径,对圆…...
TensorRT的结构
Builder(网络原数据):模型搭建的入口,网络的tensorRT内部表示以及可执行程序引擎都是由该对象的成员方法生成的 BuiderConfig(网络原数据的选项):负责设置模型的一些参数,如是否开始…...
python对excel数据表进行数据清洗
当拿到excel表,使用python对excel操作前,第一件事情是对excel表的数据进行数据清洗。 数值是否有空值,是否有重复的数据,把以上2个问题解决完成以后,才是对数据真正操作的开始。 1、使用pandans读取数据 2、判断exce…...
95、Spring Data Redis 之使用RedisTemplate 实现自定义查询 及 Spring Data Redis 的样本查询
Spring Data Redis 之使用RedisTemplate 实现自定义查询 Book实体类 原本的接口,再继承我们自定义的接口 自定义查询接口----CustomBookDao 实现类:CustomBookDaoImpl 1、自定义添加hash对象的方法 2、自定义查询价格高于某个点的Book对象 测试&a…...
jdbc(DriverManager+Connection+Statement+ResultSet)+SQL注入+开启预编译+数据连接池
1 JDBC概念 JDBC 就是使用Java连接并操作数据库的一套API 全称:( Java DataBase Connectivity ) Java 数据库连接 2 JDBC优势 可随时替换底层数据库,访问数据库的Java代码基本不变 以后编写操作数据库的代码只需要面向JDBC(接口…...
NoSQL之 Redis命令工具及常用命令
目录 1 Redis 命令工具 1.1 redis-cli 命令行工具 1.2 redis-benchmark 测试工具 2 Redis 数据库常用命令 2.1 set:存放数据,命令格式为 set key value 2.2 get:获取数据,命令格式为 get key 2.3 keys 命令可以取符合规则的…...
多线程(线程互斥)
抢票代码编写 学习了前面有关线程库的操作后,我们就可以模拟抢票的过程 假设我们创建四个线程,分别代表我们的用户 然后设定总票数为1000张,四个线程分别将进行循环抢票操作,其实就是循环对票数进行打印,并进行对应的…...
使用 html2canvas 和 jspdf 将页面转 pdf,同时解决当页面过长时,页面白屏问题
代码如下,直接粘贴复制即可,代码中 jspdf 是全局引入,你可以自己局部引入 别人使用标签的方式来显示 base64,但是当页面过长时,base64 大小过大会导致页面解析异常,显示白屏 import html2canvas from html2…...
【Python 千题 —— 基础篇】今年几岁啦
题目描述 题目描述 介绍自己的年龄。请使用 input 函数读入一个整数,表示自己的年龄,然后程序将自动生成介绍自己年龄的英文语句。 输入描述 输入一个整数,表示自己的年龄。 输出描述 程序将生成一个英文语句,以介绍自己的年…...
git push 失败 shallow update not allowed
问题描述: ~/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中变量的使用,而我想定义方法,这样写css样式更方便 一、官方文档的介绍 根据官方文档我知道,在这面定义的变量全局都可使用。接下来我要在这里定义方法。 二、在uni.scss文件中定义方法 我在uni.scss文件中定义了…...
C++ 类和对象(一)
1.面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完 成。 …...
rust函数
一 、函数定义 (一)格式 使用fn关键字 fn是 function 的缩写 1.无返回值的 fn 函数名 ( [paraname: type]... ) {函数体 }参数必须声明参数名称和类型 函数定义时指定的参数叫做 形参。调用时传递给函数的参数叫做 实参。 例子 fn another_function(…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
