观察者模式与Boost.Signals
1) 观察者模式定义
略,各种设计模式的书上都有定义。
2) 观察者模式一般实现
观察者模式一般实现,都是“被观察者”保存一个“观察者”的列表,循环这个列表来通知“观察者”。代码,其中使用了boost的智能指针shared_ptr:
- #include <iostream>
- #include <list>
- #include "boost/shared_ptr.hpp"
- using namespace std;
- using namespace boost;
- //观察者基类
- class Observer
- {
- public:
- //处理被观察者的通知
- virtual void update(const int i) = 0;
- };
- //观察者类A
- class ObserverA : public Observer
- {
- public:
- virtual void update(const int i)
- {
- cout << "ObserverA.update(" << i << ")" << endl;
- }
- };
- //观察者类B
- class ObserverB : public Observer
- {
- public:
- virtual void update(const int i)
- {
- cout << "ObserverB.update(" << i << ")" << endl;
- }
- };
- //被观察者基类
- class Subject
- {
- public:
- virtual ~Subject()
- {
- }
- //注册观察者
- virtual void reg(const shared_ptr<Observer>& pObs) = 0;
- //取消注册观察者
- virtual void unreg(const shared_ptr<Observer>& pObs) = 0;
- //通知观察者
- virtual void notify(const int i) = 0;
- };
- //被观察者类A
- class SubjectA : public Subject
- {
- public:
- virtual void reg(const shared_ptr<Observer>& pObs)
- {
- m_lstObs.push_back(pObs);
- }
- virtual void unreg(const shared_ptr<Observer>& pObs)
- {
- for (list<shared_ptr<Observer> >::iterator it = m_lstObs.begin();
- it != m_lstObs.end();)
- {
- if (pObs == *it) m_lstObs.erase(it++);
- else ++it;
- }
- }
- virtual void notify(const int i)
- {
- for (list<shared_ptr<Observer> >::iterator it = m_lstObs.begin();
- it != m_lstObs.end(); ++it)
- {
- (*it)->update(i);
- }
- }
- protected:
- //观察者类别
- list<shared_ptr<Observer> > m_lstObs;
- };
- int main()
- {
- //被观察者pSubA
- shared_ptr<Subject> pSubA(new SubjectA);
- //观察者pObsA
- shared_ptr<Observer> pObsA(new ObserverA);
- //观察者pObsB
- shared_ptr<Observer> pObsB(new ObserverB);
- //注册pObsA
- pSubA->reg(pObsA);
- //注册pObsB
- pSubA->reg(pObsB);
- //通知
- pSubA->notify(1); //显示
- //ObserverA.update(1)
- //ObserverB.update(1)
- //取消pObsA的注册
- pSubA->unreg(pObsA);
- //通知
- pSubA->notify(2); //显示
- //ObserverB.update(2)
- return 0;
- }
3) 观察者模式Boost.Signals实现
Boost.Signals是基于函数指针或函数对象来实现观察者模式的。其中Boost.Signals2是线程安全版本。代码:
- #include <iostream>
- #include <list>
- #include "boost/shared_ptr.hpp"
- #include "boost/signal.hpp"
- using namespace std;
- using namespace boost;
- //使用函数对象来实现
- //观察者类A
- class ObserverA
- {
- public:
- void operator()(const int i)
- {
- cout << "ObserverA(" << i << ")" << endl;
- }
- };
- //观察者类B
- class ObserverB
- {
- public:
- void operator()(const int i)
- {
- cout << "ObserverB(" << i << ")" << endl;
- }
- };
- int main()
- {
- //被观察者sig
- signal<void (const int)> sig;
- //注册观察者ObserverA
- signals::connection connA = sig.connect(ObserverA());
- //注册观察者ObserverB
- sig.connect(ObserverB());
- //通知
- sig(1); //显示
- //ObserverA(1)
- //ObserverB(1)
- //取消obsA的注册
- connA.disconnect();
- //通知
- sig(2); //显示
- //ObserverB(2)
- return 0;
- }
Boost.Signals还支持被观察者分组,可以对整个组进行“通知”、取消注册。另外,Boost.Signals需要编译才能使用。
观察者模式与Boost.Signals的更多相关文章
- boost::signals::signal的使用方法
吃力的讲完boost::signals的ppt.然后接着就是做练习题. 通过讲ppt,发现有一句话说的真好:你自己知道是一回事.你能给别人讲明确又是另外一回事.真的有些东西你自己理解,可是用语言去非常 ...
- vs2013 boost signals
#include "stdafx.h" #include <boost/signals2/signal.hpp> #include <iostream> u ...
- Linux上安装使用boost入门指导
Data Mining Linux上安装使用boost入门指导 获得boost boost分布 只需要头文件的库 使用boost建立一个简单的程序 准备使用boost二进制文件库 把你的程序链接到bo ...
- Windows下如何使用BOOST C++库 .
Windows下如何使用BOOST C++库 我采用的是VC8.0和boost_1_35_0.自己重新编译boost当然可以,但是我使用了 http://www.boostpro.com/produc ...
- 以boost::function和boost:bind取代虚函数
转自:http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx 这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不 ...
- Win7下Boost库的安装
Boost库是C++领域公认的经过千锤百炼的知名C++类库,涉及编程中的方方面面,简单记录一下使用时的安装过程 1.boost库的下载 boost库官网主页:www.boost.org 2.安装 将下 ...
- VS2008下直接安装使用Boost库1.46.1版本号
Boost库是一个可移植.提供源码的C++库,作为标准库的后备,是C++标准化进程的发动机之中的一个. Boost库由C++标准委员会库工作组成员发起,当中有些内容有望成为下一代C++标准库内容.在C ...
- VS2008下直接安装使用Boost库1.46.1版本
Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++ ...
- boost事件处理
尽管这个库的名字乍一看好象有点误导,但实际上并不是如此. Boost.Signals 所实现的模式被命名为 '信号至插槽' (signal to slot).它基于下面概念:当相应的信号被发出时.相关 ...
随机推荐
- 绘制更Smooth的UI
以前很长一段时间,在自定义控制绘制时,只是简单的定义一个QPainter对象而开始绘画.经常会画一些圆角矩形,甚至是一些不规则的图形.对于不规则的图形来说,如果PS技术不好,或者mask制作的不好,常 ...
- Android 自定义控件 优雅实现元素间的分割线 (支持3.0以下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42407923 ,本文出自:[张鸿洋的博客] 1.概述 话说,随着Android ...
- android调试系列--使用ida pro调试原生程序
1.工具介绍 IDA pro: 反汇编神器,可静态分析和动态调试. 模拟机或者真机:运行要调试的程序. 样本:自己编写NDK demo程序进行调试 2.前期准备 2.1 准备样本程序(假设已经配置好 ...
- 编译U-boot时,make[1]: *** 没有规则可以创建mkimage.o”
执行完make smdk2440_config 对Uboot重行编译怎么会出现这样的错误 make[1]: Entering directory `/home/win/S3-ARM/Part4/ubo ...
- (转)sql语句中charindex的用法
假如你写过很多程序,你可能偶尔会碰到要确定字符或字符窜串否包含在一段文字中,在这篇文章中,我将讨论使用CHARINDEX和PATINDEX函数来搜索文字列和字符串.我将告诉你这两个函数是如何运转的,解 ...
- 《第一行代码》学习笔记30-内容提供器Content Provider(3)
1."如何在自己的程序中访问其他应用程序的数据",思路->获取到该应用程序的内容URI,再借助ContentResolver进行CRUD操作. 2.要实现跨程序共享数据-&g ...
- java 静态文件使用注解
spring框架为我们代码的编写带来了极大的便利,特别是注解的使用.但是有个问题,当我们在静态文件中使用注解的时候,这个时候就会报错了.如以下代码: @Autowired private UserSe ...
- hadoop之MapReduce WordCount分析
MapReduce的设计思想 主要的思想是分而治之(divide and conquer),分治算法. 将一个大的问题切分成很多小的问题,然后在集群中的各个节点上执行,这既是Map过程.在Map过程结 ...
- 使用ganymed-ssh2-build通过ssh获得远程服务器参数
1.项目中需要检测到几台远程服务器的参数,差了很多资料,决定用的这个 2.jar包:ganymed-ssh2-build210.jar 3.原理:向远程linux服务器发送脚本命令,得到该台服务器的信 ...
- NAS4Free 安装配置(五)配置SMB
配置SMB 现在我们有2块存储设备,一块做下载盘,一块做数据盘 为了便于管理和扩展,我们分别在两块盘上建文件夹和Dataset 对于download盘,因为是UFS,所以只能建文件夹 我们把整个盘共享 ...