1. /*
  2. Andy is going to hold a concert while the time is not decided.
  3. Eric is a fans of Andy who doesn't want to miss this concert.
  4. Andy doesn't know Eric.
  5. How can Eric gets the news when Andy's concert is going to take?
  6. */
  7. /*
  8. Singer:被观察者
  9. Fans:观察者
  10. */
  11. #include "stdafx.h"
  12. #include <iostream>
  13. #include <boost/signals2.hpp>
  14. #include <boost/bind.hpp>
  15. #include <string>
  16. using namespace std;
  17. struct Singer
  18. {
  19. //定义信号的类型,也就是说 Singer 需要知道 Fans 的响应方式
  20. //也就是说 Singer 需要知道 Fans 会采用什么样的方式来响应 Singer 所发出的信号
  21. //或者说 Singer 需要知道 Fans 用什么样的方式来接受 Singer 发出的信号
  22. //就相当于 Singer 需要知道 Fans的“邮箱”,到时候才可以将信息投递到 Fans 的“邮箱”类型中去
  23. //Fans 的“邮箱”类型—— void (string time)
  24. typedef boost::signals2::signal<void (string time)> signalType;
  25. typedef signalType::slot_type slotType;
  26. signalType m_signal; //定义一个信号
  27. //Singer 发布信号
  28. void PublishTime(string time)
  29. {
  30. m_signal(time); //将包含 time 信息的信号m_signal投递到 Fans 的邮箱中去,注意,投递之前这种类型的邮箱必须要和一个具体的Fans联系起来,即必须知道是谁拥有这种类型的邮箱,这一动作通过后边的Subscribe实现。
  31. }
  32. //Singer 提供一种注册渠道:Fans们可以通过这个渠道来进行注册,告诉Singer,有新信号的话就发送给我一个消息
  33. boost::signals2::connection Subscribe(const slotType& fans)
  34. {//在这里将Fans与Singer建立起一种联系(connection)
  35. //到后面可以发现,Fans需要调用这个函数,即通过这个渠道告诉Singer有消息就要通知给我
  36. return m_signal.connect(fans);
  37. }
  38. };
  39. struct Fans
  40. {
  41. // m_connection:联系的存在是在整个Fans的生命周期内的,一旦Fans消失,这种联系也就不复存在了
  42. boost::signals2::scoped_connection m_connection;
  43. //Fans的响应方式,也就是Fans的邮箱类型,至于里面具体做什么事情,Singer不需要知道。
  44. void Correspond(string time)
  45. {
  46. cout<<"I know the concert time: "<<time<<endl;
  47. }
  48. //Fans需要自己确定他要关注(观察)哪一个Singer 的动向
  49. void Watch(Singer& singer)
  50. {
  51. //通过调用Singer的Subscribe函数(渠道)来将自己的邮箱地址告知Singer
  52. m_connection = singer.Subscribe(boost::bind(&Fans::Correspond, this, _1));
  53. }
  54. };
  55. int main(int argc, char* argv[])
  56. {
  57. Singer  Andy; //刘德华
  58. Fans    Eric; //Eric
  59. Eric.Watch(Andy); //Eric告知刘德华:我要关注你的动向,请把你的最新信息发给我
  60. Andy.PublishTime("2010/10/01");//刘德华发布最新信息,一旦信息发布,Eric的邮箱——void Correspond(string time)就会接受到信息,并进行响应——cout<<….
  61. return 0;
  62. }

Reference:

http://www.cppprog.com/boost_doc/doc/html/signals2/tutorial.html

http://www.cppprog.com/2009/0430/111.html

http://www.cppprog.com/boost_doc/

BOOST::Signals2的更多相关文章

  1. Boost信号/槽signals2

    信号槽是Qt框架中一个重要的部分,主要用来解耦一组互相协作的类,使用起来非常方便.项目中有同事引入了第三方的信号槽机制,其实Boost本身就有信号/槽,而且Boost的模块相对来说更稳定. signa ...

  2. boost之signal

    boost里的signal是一个模板类,不区分信号种类,产生信号统一用()调用操作符. 1.回调普通函数代码示例: #include <iostream> #include <str ...

  3. Using Boost Libraries in Windows Store and Phone Applications

    Using Boost Libraries in Windows Store and Phone Applications RATE THIS Steven Gates 18 Jul 2014 5:3 ...

  4. 观察者模式与Boost.Signals

      1)  观察者模式定义 略,各种设计模式的书上都有定义. 2)  观察者模式一般实现 观察者模式一般实现,都是“被观察者”保存一个“观察者”的列表,循环这个列表来通知“观察者”.代码,其中使用了b ...

  5. boost signal2 slot_base

    先看成员_tracked_objects,从字面上讲是被跟踪的对象,再看,相关函数 bool expired() const,这个函数是检查_tracked_objects是否已经expired.只不 ...

  6. boost事件处理

    尽管这个库的名字乍一看好象有点误导,但实际上并不是如此. Boost.Signals 所实现的模式被命名为 '信号至插槽' (signal to slot).它基于下面概念:当相应的信号被发出时.相关 ...

  7. boost::signals::signal的使用方法

    吃力的讲完boost::signals的ppt.然后接着就是做练习题. 通过讲ppt,发现有一句话说的真好:你自己知道是一回事.你能给别人讲明确又是另外一回事.真的有些东西你自己理解,可是用语言去非常 ...

  8. boost------signals2的使用1(Boost程序库完全开发指南)读书笔记

    signals2基于Boost的另一个库signals,实现了线程安全的观察者模式.在signals2库中,观察者模式被称为信号/插槽(signals and slots),他是一种函数回调机制,一个 ...

  9. boost------signals2的使用2(Boost程序库完全开发指南)读书笔记

    1.应用于观察者模式 本小节将使用signals2开发一个完整的观察者模式示例程序,用来演示信号/插槽的用法.这个程序将模拟一个日常生活场景:客人按门铃,门铃响,护士开门,婴儿哭闹. Ring.h: ...

随机推荐

  1. vue 使用总结

    1.Vuejs组件 vuejs构建组件使用 Vue.component('componentName',{ /*component*/ }): 这里注意一点,组件要先注册再使用,也就是说: Vue.c ...

  2. C#递归算法详解

    递归呢就是自己调用自己,在搜索文件夹下的文件和目录时也能用到,我这里就写一个简单的递归,代码如下: /// <summary> /// 递归算法 /// </summary> ...

  3. (转)Windows Server 2008 默认"照片库查看器" 无法打开图片, 只能用画图程序打开

    1.解决[启用Win2008照片查看器] Win2008 中放了一些图片,本来以为可以象Win7那样直接用“照片查看器”打开,可是Win2008默认竟然是用“画图”打开的,非常不方便. 再仔细一看,“ ...

  4. 18 java 代理模式 (转)

    静态代理 1.新建一个接口,这个接口所提供的方法是关于数据库操作的 public interface EmployeeDao { public void updateSalary(); } 2.建一个 ...

  5. mac删除顽固图标

    cd  /Users/shelley/Library/Application\ Support/Dock cp  10CCA448-0975-41DE-B47A-8E89FD634227.db  10 ...

  6. dobbo学习

    http://www.cnblogs.com/Javame/p/3632473.html 1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以 ...

  7. python学习第二天 --变量及其字符串

    python变量: 在计算机程序中,变量不仅可以是数字,还可以是任意数据类型. 在Python程序中,变量是用一个变量名表示,变量名必须是大小写英文.数字和下划线(_)的组合,且不能用数字开头. 在P ...

  8. python多进程断点续传分片下载器

    python多进程断点续传分片下载器 标签:python 下载器 多进程 因为爬虫要用到下载器,但是直接用urllib下载很慢,所以找了很久终于找到一个让我欣喜的下载器.他能够断点续传分片下载,极大提 ...

  9. JavaWeb学习笔记--Servlet代码集

    目录: 登录系统提交表单数据打开PDFCookieURL传递参数URL重写跟踪会话使用HttpSession对象跟踪会话Servlet间协作过滤器Filter 登录系统 <!DOCTYPE HT ...

  10. Virtual Box 工具栏(菜单栏)消失的解决方法

    异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html 现在Virtual Box非常牛逼(不排除Oracle又准备像Java SE那样 ...