观察者模式与Boost.Signals

1)  观察者模式定义

略,各种设计模式的书上都有定义。

 

2)  观察者模式一般实现

观察者模式一般实现,都是“被观察者”保存一个“观察者”的列表,循环这个列表来通知“观察者”。代码,其中使用了boost的智能指针shared_ptr:

 

[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <list>  
  3. #include "boost/shared_ptr.hpp"  
  4. using namespace std;  
  5. using namespace boost;  
  6.   
  7. //观察者基类  
  8. class Observer  
  9. {  
  10. public:  
  11.     //处理被观察者的通知  
  12.     virtual void update(const int i) = 0;  
  13. };  
  14.   
  15. //观察者类A  
  16. class ObserverA : public Observer  
  17. {  
  18. public:  
  19.     virtual void update(const int i)  
  20.     {  
  21.         cout << "ObserverA.update(" << i << ")" << endl;  
  22.     }  
  23. };  
  24.   
  25. //观察者类B  
  26. class ObserverB : public Observer  
  27. {  
  28. public:  
  29.     virtual void update(const int i)  
  30.     {  
  31.         cout << "ObserverB.update(" << i << ")" << endl;  
  32.     }  
  33. };  
  34.   
  35. //被观察者基类  
  36. class Subject  
  37. {  
  38. public:  
  39.     virtual ~Subject()  
  40.     {  
  41.   
  42.     }  
  43.     //注册观察者  
  44.     virtual void reg(const shared_ptr<Observer>& pObs) = 0;  
  45.     //取消注册观察者  
  46.     virtual void unreg(const shared_ptr<Observer>& pObs) = 0;  
  47.     //通知观察者  
  48.     virtual void notify(const int i) = 0;  
  49. };  
  50.   
  51. //被观察者类A  
  52. class SubjectA : public Subject  
  53. {  
  54. public:  
  55.     virtual void reg(const shared_ptr<Observer>& pObs)  
  56.     {  
  57.         m_lstObs.push_back(pObs);  
  58.     }  
  59.     virtual void unreg(const shared_ptr<Observer>& pObs)  
  60.     {  
  61.         for (list<shared_ptr<Observer> >::iterator it = m_lstObs.begin();  
  62.             it != m_lstObs.end();)  
  63.         {  
  64.             if (pObs == *it) m_lstObs.erase(it++);  
  65.             else ++it;  
  66.         }  
  67.     }  
  68.     virtual void notify(const int i)  
  69.     {  
  70.         for (list<shared_ptr<Observer> >::iterator it = m_lstObs.begin();  
  71.             it != m_lstObs.end(); ++it)  
  72.         {  
  73.             (*it)->update(i);  
  74.         }  
  75.     }  
  76. protected:  
  77.     //观察者类别  
  78.     list<shared_ptr<Observer> > m_lstObs;  
  79. };  
  80.   
  81. int main()  
  82. {  
  83.     //被观察者pSubA  
  84.     shared_ptr<Subject> pSubA(new SubjectA);  
  85.     //观察者pObsA  
  86.     shared_ptr<Observer> pObsA(new ObserverA);  
  87.     //观察者pObsB  
  88.     shared_ptr<Observer> pObsB(new ObserverB);  
  89.     //注册pObsA  
  90.     pSubA->reg(pObsA);  
  91.     //注册pObsB  
  92.     pSubA->reg(pObsB);  
  93.     //通知  
  94.     pSubA->notify(1);                //显示  
  95.                                     //ObserverA.update(1)  
  96.                                     //ObserverB.update(1)  
  97.     //取消pObsA的注册  
  98.     pSubA->unreg(pObsA);  
  99.     //通知  
  100.     pSubA->notify(2);                //显示  
  101.                                     //ObserverB.update(2)  
  102.     return 0;  
  103. }  

 

 

3)  观察者模式Boost.Signals实现

Boost.Signals是基于函数指针或函数对象来实现观察者模式的。其中Boost.Signals2是线程安全版本。代码:

 

[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <list>  
  3. #include "boost/shared_ptr.hpp"  
  4. #include "boost/signal.hpp"  
  5. using namespace std;  
  6. using namespace boost;  
  7.   
  8. //使用函数对象来实现  
  9. //观察者类A  
  10. class ObserverA  
  11. {  
  12. public:  
  13.     void operator()(const int i)  
  14.     {  
  15.         cout << "ObserverA(" << i << ")" << endl;  
  16.     }  
  17. };  
  18.   
  19. //观察者类B  
  20. class ObserverB  
  21. {  
  22. public:  
  23.     void operator()(const int i)  
  24.     {  
  25.         cout << "ObserverB(" << i << ")" << endl;  
  26.     }  
  27. };  
  28.   
  29. int main()  
  30. {  
  31.     //被观察者sig  
  32.     signal<void (const int)> sig;  
  33.     //注册观察者ObserverA  
  34.     signals::connection connA = sig.connect(ObserverA());  
  35.     //注册观察者ObserverB  
  36.     sig.connect(ObserverB());  
  37.   
  38.     //通知  
  39.     sig(1);                 //显示  
  40.                             //ObserverA(1)  
  41.                             //ObserverB(1)  
  42.     //取消obsA的注册  
  43.     connA.disconnect();  
  44.     //通知  
  45.     sig(2);                 //显示  
  46.                             //ObserverB(2)  
  47.     return 0;  
  48. }  

 

Boost.Signals还支持被观察者分组,可以对整个组进行“通知”、取消注册。另外,Boost.Signals需要编译才能使用。

转载于:https://www.cnblogs.com/lvdongjie/p/4452056.html

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

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

相关文章

Android获取最新发送短信的基本信息,没有之一

注册&#xff1a; getContentResolver().registerContentObserver( Uri.parse("content://sms"), true, new SmsObserver(this, new Handler())); 监听&#xff1a; //用于检测发出的短信 public class SmsObserver extends Conten…

联想android刷机教程,超详细的联想刷机教程~带你嘻刷刷

一、刷机是什么说到“刷机”&#xff0c;很多人可能会和“升级”混淆起来&#xff0c;其实升级和刷机并不是同一概念。通俗地讲&#xff0c;升级就是对手机内的软件或系统进行升级&#xff0c;比如很多厂商手机都支持的OTA空中在线升级。而刷机&#xff0c;则相当于就是重装系统…

我的github地址

我的github仓库地址 https://github.com/xutiantian/Test转载于:https://www.cnblogs.com/xuxiaomeng/p/4455850.html

多看 android6,多看阅读本地版

为您推荐&#xff1a;多看阅读《多看阅读本地版》是一款由多看科技倾情研发打造的海量优质完本小说免费在线阅读app软件&#xff0c;这款软件的功能非常的全面&#xff0c;操作性简单&#xff0c;上手起来非常的容易&#xff0c;在这款软件里&#xff0c;各位用户们将能够于此体…

UIProgressView-初识IOS

好几天没更新了&#xff0c;学的时候太紧&#xff0c;没时间复习了都。今天刚好有时间&#xff0c;多更几个。 今天复习的是UIProgressView,我们常见使用在修改某些属性的时候经常用到&#xff0c;比如透明度&#xff0c;今天我们介绍一个简单的使用例子 定义什么的&#xff0c…

android正则判断两个符号之间,Android字母、数字、字符任意两种组合正则验证

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;最近朋友有个用户名验证&#xff0c;要求字母、数字、字符任意两种组合即可&#xff0c;让我帮写个正则验证&#xff0c;现在正则验证如下&#xff1a;/*** 判断是否匹配正则** param regex 正则表达式* param inp…

android手机deviceowner,删除 androidDeviceOwnerWiFiConfiguration

删除 androidDeviceOwnerWiFiConfigurationDelete androidDeviceOwnerWiFiConfiguration2021/3/24本文内容命名空间&#xff1a;microsoft.graphNamespace: microsoft.graph重要提示&#xff1a; /beta 版本下的 Microsoft Graph API 可能会更改;不支持生产使用。Important: Mi…

浅谈0/1切换

前言:   做过GUI开发的同学, 都知晓双缓存机制. 其过程为先把所有的场景和实体对象画到一个备份canvas, 然后再把备份canvas的内容整个填充真正的画板canvas中. 如果不采用双缓存机制, 你的画面有可能会出现闪烁和抖动.   究其原因是整个绘制过程, 包含清屏, 绘制场景和各…

Action和Func区别

Action<>和Func<>其实都是委托的【代理】简写形式。 简单的委托写法&#xff1a; 1 //普通的委托2 public delegate void myDelegate(string str);3 4 //Delegate委托调。5 myDelegate dDelegate new myDelegate(SayHellow);6 dDelegate("Mr wang");7 8…

最好的android one手机,最高配置的Android One手机登场 LG推出G7 One与G7 F

原标题&#xff1a;最高配置的Android One手机登场 LG推出G7 One与G7 F集微网消息&#xff0c;Android One原本是谷歌与中国台湾的联发科共同开发的一个项目&#xff0c;旨在让手机制造商打造低成本的智能手机&#xff0c;这些手机主要是销售给新兴市场上的近10亿潜在用户。随着…

CAEmitterLayer 和 CAEmitterCell 粒子发射

CAEmitterLayer emitterCells&#xff1a;CAEmitterCell对象的数组&#xff0c;被用于把粒子投放到layer上 birthRate:可以通俗的理解为发射源的个数&#xff0c;默认1.0。当前每秒产生的真实粒子数为CAEmitterLayer的birthRate*子粒子的birthRate&#xff1b; lifetime emitte…

android 音量调节 seekbar,Android 使用SeekBar调节系统音量

以下是一个使用SeekBar来调节系统音量的实例&#xff1a;1、XML&#xff1a;android:id"id/sound"android:layout_width"150px"android:layout_height"10px"android:max"100"//设置拖动条最大值android:progress"10"//设置拖…

vs代码模板制作

VS2008代码模板制作 一&#xff0c;类模板制作&#xff1a; 路径&#xff1a;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplatesCache\CSharp\Code\2052\Class.zip 操作&#xff1a;打开Class.cs文件&#xff0c;编辑内容如下&#xff1a; // <…

html语言文本框的符号,HTML中的文本框textarea标签

用来创建一个可以输入多行的文本框&#xff0c;此标志对用于标志对之间。具有以下属性&#xff1a;(1)onchange指定控件改变时要调用的函数(2)onfocus当控件接受焦点时要执行的函数(3)onblur当控件失去焦点时要执行的函数(4)onselect当控件内容被选中时要执行的函数(5)name这文…

pads导出坐标文件html,【教程】PADS如何导出SMT贴片机用的坐标文件

找到一个好办法&#xff0c;用wps的Excel软件的话&#xff0c;将脚本进行如下修改即可。修改前&#xff1a;Sub ExportToExcel (txt As String)FillClipboardDim xl As ObjectOn Error Resume NextSet xl GetObject(,"Excel.Application")On Error GoTo ExcelError …

avalon框架,简单的MVVM

今天我又要挑战一次一个高大上的公司了 但是看着jd有点忧伤了要求如下 基本要求&#xff1a;1、熟悉 HTML / CSS / JS 并有良好的代码风格&#xff1b;2、理解 Web 标准&#xff0c;语义化&#xff0c;可以解决主流浏览器及不同版本的兼容性问题&#xff1b;3、熟悉常见框架&am…

微信公众号里如何上传html,微信公众号怎么做表单,微信万能表单如何添加到公众号里...

微信的使用占据着大众的日常&#xff0c;而微信上的一些订单、预约、登记、投诉、反馈等功能都可以使用微信万能表单来实现&#xff0c;那么微信万能表单怎么做&#xff1f;下文带来微信公众号表单制作方法&#xff0c;方法很简单&#xff0c;需要的朋友一起看看吧。微信万能表…

GridView控件RowDataBound事件中获取列字段值的几种途径

前台&#xff1a; <asp:TemplateField HeaderText"充值总额|账号余额"><ItemTemplate><asp:Label ID"lblSurplusMoney" runat"server" Text""></asp:Label></ItemTemplate></asp:TemplateField> …

html复选框值改变后事件,javascript – 从onclick/onchange事件获取HTML值的复选框

简短的回答&#xff1a;使用点击事件&#xff0c;它不会触发&#xff0c;直到更新的值&#xff0c;并触发时&#xff0c;你希望它&#xff1a;Checkboxfunction handleClick(cb) {display("Clicked, new value " cb.checked);}更长的答案&#xff1a;更改事件处理程…

BZOJ-2194 快速傅立叶之二

FFT模版题。 观察题目&#xff0c;我们可以发现&#xff0c;只要把序列b倒过来&#xff0c;再联想一下乘法运算。。。 我们会发现&#xff0c;将序列a和序列b当作100进制数&#xff0c;做一次乘法&#xff0c;然后从低到高每一位便是答案了&#xff08;乘完无需进位&#xff09…