博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ 观察者模式
阅读量:6049 次
发布时间:2019-06-20

本文共 2785 字,大约阅读时间需要 9 分钟。

观察者模式之比喻:

有家公司,老板经常不按时上班,于是员工就可以在老板来之前的那段时间娱乐一下,但是又过的是心惊胆战,怕
老板随时出现;这是观察者模式就起作用了;公司有个前台,她总是第一个看到老板进门并且有时间通知大家的人,
于是员工都可以在前台那里登记一下,是否需要得到通知,其他事情也可以通过前台通知,比如说来了一个快递等;
实现代码如下:
1 /**  2 * Define observer mode  3 */  4 #include 
5 #include
6 using namespace std; 7 8 #ifndef NULL 9 #define NULL ((void*)0) 10 #endif 11 12 // 各种消息的基类 13 class DOBject 14 { 15 public: 16 DOBject(int value){ 17 value = value; 18 } 19 ~DOBject(); 20 private: 21 public: 22 /* data */ 23 int value; 24 public: 25 /* Function */ 26 bool operator ==(const DOBject &otherObject){ 27 return (value==otherObject.value); 28 } 29 }; 30 // 类员工类 31 class DListener 32 { 33 public: 34 DListener(/*arguments*/); 35 ~DListener(); 36 /* data */ 37 /* Respond to notify */ 38 public: 39 void OnNotify(DObject *object) 40 { 41 // Do something 42 return ; 43 } 44 }; 45 // 类前台类 46 class DObserverObject 47 { 48 public: 49 DObserverObject(/*arguments*/){ 50 m_pListeners = new List
(); 51 m_pObject = new DObject(); 52 } 53 ~DObserverObject(){ 54 if (NULL != m_pObject) 55 { 56 /* code */ 57 delete m_pObject; 58 } 59 if (NULL != m_pListeners) 60 { 61 /* 需要循环把list里面的注册者都清理掉 */ 62 for(int i=0, count=m_pListeners->size(); i < count; ++i){ 63 delete m_pListeners->get(i); 64 m_pListeners->get(i) = NULL; 65 } 66 delete m_pListeners; 67 } 68 } 69 // 员工注册 70 void Registe(DListener *newListener){ 71 m_pListeners->add(newListener); 72 } 73 // 取消注册 74 void UnRegiste(DListener *newListener){ 75 m_pListeners->remove(newListener); 76 } 77 //通知员工 78 void SendNotify(void){ 79 for (int i = 0; i < m_pListeners.size(); ++i) 80 { 81 /* 需要循环将所有注册的员工都通知到 */ 82 m_pListeners[i]->OnNotify(m_pObject); 83 } 84 } 85 // 一般对于这个有俩种传递数据的方式,推或者拉 86 // 对于推方式,则SendNotify需要加参数; 87 // 对于拉方式,则SendNotify不需要参数,由员工自己通过GetValue去取 88 DObject *GetValue(void){ 89 return m_pObject; 90 } 91 //发生了什么事情,老板来了,或者快递来了 92 void SetValue(DObject *newObject){ 93 if (m_pObject!=*newObject) 94 { 95 /* code */ 96 m_pObject->value = newObject->value; 97 SendNotify(newObject); 98 } 99 }100 /* data */101 private:102 List
*m_pListeners;103 DObject *m_pObject;104 };

对于以上代码可能对于list的使用存在问题,还未完全测试,有兴趣的可以自己进行测试,也可以自己自己采用其他数据结构!

谢谢!

转载于:https://www.cnblogs.com/dhf-0214/p/3511158.html

你可能感兴趣的文章
十分钟入门RocketMQ
查看>>
年计划,技术儿告诉你怎么做?
查看>>
通过ODBC连接PostgreSQL和Greenplum
查看>>
2015.08.19结构体
查看>>
Nodejs测试:从0到90(理论篇)
查看>>
Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
查看>>
windows7下制作苹果mac os x 10.10Yosemiteu盘启动盘
查看>>
Appium移动自动化测试(四)--one demo
查看>>
这是就是联想?2年4次因同一问题返售后,售后找不到确切原因。。。。。
查看>>
10、spss做最优尺度分析
查看>>
OCMaskedTextField
查看>>
Linux命令学习总结:reboot命令
查看>>
【Oracle】使用hanganalyze 命令分析数据库hang【转】
查看>>
Python 应用剖析工具介绍
查看>>
JSP标准标签库
查看>>
ceph - adding A monitor (MANUAL)
查看>>
MYSQL的慢查询分析
查看>>
Go系统下的自定义属性文件的增删改查
查看>>
mysql一些比较冷门的查询
查看>>
MapXtreme 2005 学习心得 工具(六)
查看>>