0. 简介

个人认为观察者模式作为行为模式中非常重要的一个部分,我们日常使用的事件机制就是一个观察者模式,当事件发生,所有的事件接收者执行事件响应函数。在ROS中的subscribers函数也是使用了类似的思想。它允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。

1. 订阅者模式示意图

从ROS的Topic层面理解,拥有一些值得关注的状态的对象通常被称为目标, 由于它要将自身的状态改变通知给其他对象, 我们也将其称为发布者 (publisher)。 所有希望关注发布者状态变化的其他对象被称为订阅者 (subscribers)

观察者模式建议你为发布者类添加订阅机制, 让每个对象都能订阅或取消订阅发布者事件流。该机制包括:

  1. 一个用于存储订阅者对象引用的列表成员变量;
  2. 几个用于添加或删除该列表中订阅者的公有方法。

    从图中我们可以看到,通过发布和订阅的机制可以有效的实现触发的方式,相比于传统的主动触发观察者模式,使用回调函数去完成观察者的时间监听触发是一个更好的选择。

2. 示例代码

2.1 普通的触发

这部分的内容没有使用回调函数去完成触发,通过调用来实现函数的使用

#include <iostream>
#include <set>using namespace std;//观察者接口,包括事件响应函数
class Observer
{public :virtual void update(int n)=0;
};//目标类,负责触发事件
class Subject
{public:Subject(){};//添加事件监听void addObserver(Observer *observer){observerSet.insert(observer);}//删除事件监听void removeObserver(Observer *observer){observerSet.erase(observer);}//触发事件void notify(int n){set<Observer *>::iterator iter;for(iter = observerSet.begin() ; iter != observerSet.end() ; ++iter){(*iter)->update(n);// iter.   ->update();}}private:set<Observer *> observerSet;
};class Observer1 :public Observer
{public:void update(int n){cout<<"观察者1事件响应函数,接受参数:"<<n<<endl;}};
class Observer2 :public Observer
{public:void update(int n){cout<<"观察者2事件响应函数,接受参数:"<<n<<endl;}};
main()
{Subject subject;Observer * observer1 = new   Observer1();Observer * observer2 = new   Observer2();subject.addObserver(observer1);subject.addObserver(observer2);subject.notify(4);subject.notify(1);}

2.2 回调函数触发

…详情请参照古月居

C++之观察者(Event-Subscriber)模式相关推荐

  1. javascript 观察者(发布订阅)模式详解

    写给读者的话 本人是千千万万前端小白中的一员,所以对前端小白的痛苦感同身受,面对一个新的知识点,很多时候感到束手无策.网上搜资料,有的不全,有的看不懂,所以本人作为小白,很有义务将自己觉得理解了的知识 ...

  2. 使用Event Bus模式解耦Android App组件间通信

    场景描述 当一个Android应用功能越来越多的时候,保证应用的各个部分之间高效的通信将变得越来越困难. 在应用中的多个地方,控件经常需要根据某个状态来更新他们显示的内容.这种场景常见的解决方式就是定 ...

  3. 分布式事务实践 解决数据一致性 分布式事务实现:Event Sourcing模式

    详细介绍了分布式事务实现的模式中的Event Sourcing模式,并通过完整实例演示了Event Sourcing模式下,实现微服务系统的分布式事务的完整过程. 8-1 事件溯源模式介绍 8-2 事 ...

  4. 对LMAX架构以及Event Sourcing模式的一些新思考和问题的记录

    最近又学习了一下LMAX架构,让我对该架构以及event sourcing模式又有了很多新的认识和疑问. 注:如果不知道什么是lmax架构和event sourcing模式的看官可以自己先去查查资料: ...

  5. 状态模式之观察者和状态模式

    机房收费系统合作时,我们发现在上下机那儿可以用到观察者模式.状态模式和职责链模式,他们都是行为型模式,但是他们是有区别的. 观察者模式 我的博客链接:机房收费系统之观察者模式. 观察者模式:一个目标物 ...

  6. event auto模式的问题

    ... 转载于:https://www.cnblogs.com/bluebbc/p/3196777.html

  7. 设计模式(3)行为型模式

    行为型模式 行为模式负责对象间的高效沟通和职责委派. 行为型模式: 策略模式:将一组算法封装成一系列对象.通过传递这些对象可以灵活的改变程序的功能.比如说:java.util.Comparator#c ...

  8. java获取jsp 组件,利用Observer模式解决组件间通信问题-JSP教程,Java技巧及代码

    1. 问题的提出 以前做一个界面的时候常常会遇到这样的尴尬情况:希望保留各个独立的组件(类),但又希望它们之间能够相互通信.譬如windows中的explorer,我们希望鼠标点击左边是树型目录的一个 ...

  9. laravel里面使用event

    模式:大概是通过一个自定义的event,一个handler,还有一个binder,然后用来简化通知模型 生成自定义的event ./artisan make:event MyEvent 生成自定义的h ...

  10. Composite UI Application Block学习笔记之Event Broker

    Composite UI Application Block着重于将应用逻辑和界面分开,让应用系统具备更清晰的结构,更强的扩展性.可移植性.在曹严明先生的讲座中,提及到了关于应用CAB开发的几个指导性 ...

最新文章

  1. Oracle中文乱码解决办法总结
  2. c++OpenCV操作mp4
  3. echo服务器(回显服务器)
  4. 订单生产计划表范本_生产计划管理与物料控制的实施步骤与要领
  5. 转:Fiddler抓包工具总结
  6. c 站点下html页面拦截器,HTML内容拦截器「HTML Content Blocker」
  7. 太强大了 | 一键生成,太强大了……
  8. 怎样三天训练出AI围棋大师?教你AlphaGo Zero的3个trick
  9. z-blog+php+漏洞,Z-Blog的PHP版前台存储型XSS漏洞一
  10. 微信H5开发-采坑记
  11. 迅盘从入门到精通 彻底告别WIN7关机烦恼 T400亲测
  12. HAOI2017 简要题解
  13. 乔治城大学计算机科学硕士2019,乔治城大学2019THE世界大学排名最新排名第109
  14. 【易通慧谷】通过一个案例两张概念图解析供应链金融
  15. 苹果手机测距离_苹果没说谎:iPhone和火星车都在用激光雷达
  16. vue生命周期(简短精干篇)
  17. 夏令时和时区最佳实践
  18. 298day(点触验证)
  19. 毛永胜计算机教师,中等职业学校网络计算机技术与应用
  20. Java回炉学习(一)

热门文章

  1. 误Ghost后的分区恢复
  2. 使用 Tesseract 进行文字识别
  3. Linux中断原理、上半部和下半部、硬中断和软中断
  4. 应用 Python PyAutoGUI 打造专属按键精灵脚本工具!
  5. Android 设备之间通过 Wifi 传输文件的功能
  6. 怎么让面试官喜欢你?
  7. 仿写天猫tmall首页
  8. [python爬虫之路day20]:CrawSpider爬取微信小程序社区技术帖
  9. ios订阅的升级和降级
  10. ldap服务器是什么