思考设计模式在自助终端软件上的应用 ——Observer(观察着)模式

主要思想:将各硬件模块作为观察者加入观察者队列,当机器状态改变时Notify所有观察者,各观察者根据消息类型做不同反应或不作反应。

下面贴出代码简单实现,希望引起圈内朋友的关注,起到抛砖引玉的效果。

 

下面两个类是两个基类.

class CObserver { public: CObserver(); virtual ~CObserver(); public: virtual void Update(HouEvent nEvent)=0; }; class CSubject { public: CSubject(); virtual ~CSubject(); public: void Attach(CObserver * pObserver); // 增加观察者 void Detach(CObserver * pObserver); // 移除观察者 void NotifyAll(HouEvent nEvent); // 通知 private: list<CObserver*> m_ObserverList; }; 

 

 

常用的状态,各设备接收到状态信息作出不同反应.

enum HouEvent { HOU_Powerup = 1001, // 启动模式 HOU_InService, // 服务模式 HOU_Suspend, // 暂停服务 HOU_Maintenance, // 维护模式 HOU_Closed, // 关闭服务 };  

 

以下是派生类:

 

class CMachine : public CSubject { public: CMachine(); virtual ~CMachine(); void InitMachine(); void SetState(HouEvent nEvent); // HouEvent GetState(); protected: CCRP * m_pCRP; CPIN * m_pPIN; CRCW * m_pRCW; }; 

 

 

下面是几个设备类,作为例子,只使用了3个设备,设备函数也只列举了几个:

 

class CCRP : public CObserver { public: CCRP(); virtual ~CCRP(); public: // 初始化 int InitDev(); // 重启 int Reset(); // 打印 int Print(); virtual void Update(HouEvent nEvent); }; class CPIN : public CObserver { public: CPIN(); virtual ~CPIN(); public: // 初始化 int InitDev(); // 重启 int ResetDev(); // 输入密码 int InputPin(); // 输入明文 int InputClear(); virtual void Update(HouEvent nEvent); }; class CRCW : public CObserver { public: CRCW(); virtual ~CRCW(); public: virtual void Update(HouEvent nEvent); }; 

 

客户端代码:

void main() { // CSubject subject; CMachine Machine; Machine.InitMachine(); // Attach应该在CSubject的派生类里调 Machine.SetState(HOU_Powerup); Machine.SetState(HOU_InService); Machine.SetState(HOU_Maintenance); } 

稍微留一张以前做过的图 ,:-)

 

转载于:https://www.cnblogs.com/dongzhiquan/archive/2009/08/07/1994752.html

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

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

相关文章

Visual studio 打包

Visual studio 打包2009-08-07 11:171.打开要打包的“.lsn”文件&#xff0c;在“解决方案资源管理器”中随便打开一个窗口 2.菜单栏“文件”--->“添加”--->“新建项目” 3. 点击“项目类型”--->“其他项目类型”--->“安装和部署”&#xff0c;再在“模板”点击…

MySQL 性能优化的最佳20多条经验分享

当我们去设计数据库表结构&#xff0c;对操作数据库时&#xff08;尤其是查表时的SQL语句&#xff09;&#xff0c;我们都需要注意数据操作的性能。这里&#xff0c;我们不会讲过多的SQL语句的优化&#xff0c;而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧…

RabbitMQ(2) 一般介绍

RabbitMQ 即一个消息队列&#xff0c;主要是用来实现应用程序的异步和解耦&#xff0c;同时也能起到消息缓冲&#xff0c;消息分发的作用。 消息中间件在互联网公司的使用中越来越多&#xff0c;刚才还看到新闻阿里将RocketMQ捐献给了apache&#xff0c;当然了今天的主角还是讲…

python--Websocket实现, 加密 sha1,base64

需要用到gevent-websocket包,这里我们用下图这个 一.websocket简单实现 ep1.py from geventwebsocket.handler import WebSocketHandler from gevent.pywsgi import WSGIServer from geventwebsocket.websocket import WebSocket # 引这个模块为了注释中显示提示用from flask i…

[工具] 解决sublime text运行javascript console无输出问题

1、使用nodeJS在sublime text 运行javascript 下载安装nodeJS在sublime text新建build system&#xff1a;tools->build system->new build system…&#xff0c;输入代码&#xff1a;{ "cmd": ["node", "$file"], "selector"…

计算机考试怎么复制粘贴文件,复制粘贴,教您电脑复制粘贴不能用了怎么解决...

操作电脑过程中经常需要复制、粘贴文字或图片&#xff0c;直接点击右键就可以操作的。但是使用过程中难免遇到一些故障问题导致右键复制粘贴功能无法使用&#xff0c;有些是软件引起的&#xff0c;有些是硬件引起的&#xff0c;怎么解决&#xff1f;下面&#xff0c;小编给大家…

【未解决】Reporting Services报表在浏览器中的显示

今天把微软的报表重新部署一遍&#xff0c;发现在不同的浏览器中&#xff0c;显示的尺寸大小不一样。在IE8浏览器中是正常的&#xff1a;而在火狐浏览器中却始终只有全屏的四分之一大小&#xff0c;无论在报表中如何修改尺寸也没有变化。看起来&#xff0c;应该是在浏览器的什么…

纽大计算机博士,斑马博士捷报|纽约大学 (NYU) MSc Computer Engineering 计算机工程硕士录取...

原标题&#xff1a;斑马博士捷报|纽约大学 (NYU) MSc Computer Engineering 计算机工程硕士录取马博士 (Dr. Zebra, Since 2010)&#xff0c; 10年来深受海内外名校申请者的青睐&#xff01;“定制化" 助你被“高于自身背景”的名校录取&#xff01;斑马博士、斑马博士留学…

GridView中的CheckBox单击事件(oncheckedchanged)

在GridView中加入 CheckBox控件&#xff0c;想通过单击选中出现如下图所示效果&#xff1a; 具体做法是&#xff1a; 前台GV部份省掉。只加关键的CheckBox部份。 <asp:CheckBox ID"ItemCheckBox" oncheckedchanged"ItemCheckBox_CheckedChanged" AutoPo…

我的世界服务器怎么找到指定路径,[小白]MC服务端目录详解

服务器的前期准备工作都做好了&#xff0c;是时候上传服务端到服务器了。不过……先等等&#xff0c;在上传前你应该先了解一下服务端目录的结构以便于后期的维护&#xff01;如图所示的是MCPC1.6.4的服务端结构示意图&#xff0c;其他开服端基本相同&#xff0c;接下来我将逐一…

java中方法的参数传递机制

转载自 &#xff1a;https://www.cnblogs.com/lixiaolun/p/4311863.html 问&#xff1a;当一个对象被当作参数传递到一个方法后&#xff0c;此方法可改变这个对象的属性&#xff0c;并可返回变化后的结果&#xff0c;那么这里到底是值传递还是引用传递?   答:是值传递。Java…

GIT-Linux(CentOS7)系统部署git服务器

GIT-Linux(CentOS7)系统部署git服务器 root账号登录 一、 安装并配置必要的依赖关系在CentOS系统上安装所需的依赖&#xff1a;ssh&#xff0c;防火墙,postfix(用于邮件通知) &#xff0c;wget&#xff0c;以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问。 1.安装ssh su…

2字段添加注释_Tableau学习系列(7):计算字段

计算字段是使用函数和运算符构造公式&#xff0c;对数据源字段&#xff08;包括维度、度量、参数等&#xff09;进行重新定义的字段。1 创建计算字段这里使用自带超市的数据&#xff0c;对各省市销售额从高到低排序进行可视化&#xff0c;但是如果想对各省销售额划份为高、中、…

SourceProvider.getJniDirectories

2019独角兽企业重金招聘Python工程师标准>>> 今天android studio跑项目&#xff0c;build了一下&#xff0c;始终跑不起&#xff0c;把gradle和android studio都更新了一下&#xff0c;还是不行&#xff0c; 一直报这个错误 UnsupportedMethodExceptionFailed to se…

虚拟服务器问题,虚拟主机常见的五大问题

导语&#xff1a;关于虚拟主机&#xff0c;很多用户在使用过程中&#xff0c;会遇到各种各样的问题&#xff0c;根据以往的客户咨询经验&#xff0c;我们总结出了几个比较常见的问题和相应的解决方案&#xff0c;希望能够帮到大家。1.空间的使用情况怎么查看有的时候客户想要看…

分类算法总结

2019独角兽企业重金招聘Python工程师标准>>> 最近在研究一些算法&#xff0c;找了一些资料&#xff0c;觉得比较全面&#xff0c;也总结的还不错. 主要分类方法介绍解决分类问题的方法很多&#xff0c; 单一的分类方法主要包括&#xff1a;决策树、贝叶斯、人…

小贝拉机器人是朋友_报废机器人应该属于什么垃圾?《宝莱坞机器人2.0》给你答案...

“你是什么垃圾&#xff1f;”如果你认为这是在骂人&#xff0c;那你就已经被时代远远的抛弃了&#xff01; 9102年&#xff0c;想要打破与陌生人的次元壁&#xff0c;研究垃圾分类&#xff0c;无疑是最快速有效的方式。但是你确定能分清楚每种垃圾的类型吗&#xff1f;比如大卸…

eclipse源服务器未能找到,eclipse - HTTP状态[404]? [未找到](原始服务器未找到当前表示) - 堆栈内存溢出...

我使用(jsp&#xff0c;servlet&#xff0c;apache tomcat 9&#xff0c;eclipse neon&#xff0c;oracle 11g)创建了一个servlet项目。 我已经创建了index.jsp(以获取登录详细信息并重定向到LoginServlet以便在数据库表中进行用户名和密码验证。在index.jsp中&#xff0c;我什…

初学ActionScript 3.0(一):Hello World

简介&#xff1a; ActionScript是 Macromedia&#xff08;现已被Adobe收购&#xff09;为其Flash产品开发的 &#xff0c;最初是一种简单的脚本语言&#xff0c;现在最新版本3.0&#xff0c;是一种完全的面向对象的编程语言&#xff0c;功能强大&#xff0c;类库丰富&#xff0…

Java探索之旅(11)——抽象类与接口

1.Java数据类型 ❶不可变类&#xff0c;是指当创建了这个类的实例后&#xff0c;就不允许修改它的属性值。 它包括&#xff1a;Primitive变量&#xff1a;boolean,byte, char, double ,float, integer, long, shortJDK不可变类&#xff1a;Boolean, Byte, Character, Double, F…