C++之观察者(Event-Subscriber)模式
0. 简介
个人认为观察者模式作为行为模式中非常重要的一个部分,我们日常使用的事件机制就是一个观察者模式,当事件发生,所有的事件接收者执行事件响应函数。在ROS中的subscribers
函数也是使用了类似的思想。它允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
1. 订阅者模式示意图
从ROS的Topic层面理解,拥有一些值得关注的状态的对象通常被称为目标, 由于它要将自身的状态改变通知给其他对象, 我们也将其称为发布者 (publisher)。 所有希望关注发布者状态变化的其他对象被称为订阅者 (subscribers)。
观察者模式建议你为发布者类添加订阅机制, 让每个对象都能订阅或取消订阅发布者事件流。该机制包括:
- 一个用于存储订阅者对象引用的列表成员变量;
- 几个用于添加或删除该列表中订阅者的公有方法。
从图中我们可以看到,通过发布和订阅的机制可以有效的实现触发的方式,相比于传统的主动触发观察者模式,使用回调函数去完成观察者的时间监听触发是一个更好的选择。
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)模式相关推荐
- javascript 观察者(发布订阅)模式详解
写给读者的话 本人是千千万万前端小白中的一员,所以对前端小白的痛苦感同身受,面对一个新的知识点,很多时候感到束手无策.网上搜资料,有的不全,有的看不懂,所以本人作为小白,很有义务将自己觉得理解了的知识 ...
- 使用Event Bus模式解耦Android App组件间通信
场景描述 当一个Android应用功能越来越多的时候,保证应用的各个部分之间高效的通信将变得越来越困难. 在应用中的多个地方,控件经常需要根据某个状态来更新他们显示的内容.这种场景常见的解决方式就是定 ...
- 分布式事务实践 解决数据一致性 分布式事务实现:Event Sourcing模式
详细介绍了分布式事务实现的模式中的Event Sourcing模式,并通过完整实例演示了Event Sourcing模式下,实现微服务系统的分布式事务的完整过程. 8-1 事件溯源模式介绍 8-2 事 ...
- 对LMAX架构以及Event Sourcing模式的一些新思考和问题的记录
最近又学习了一下LMAX架构,让我对该架构以及event sourcing模式又有了很多新的认识和疑问. 注:如果不知道什么是lmax架构和event sourcing模式的看官可以自己先去查查资料: ...
- 状态模式之观察者和状态模式
机房收费系统合作时,我们发现在上下机那儿可以用到观察者模式.状态模式和职责链模式,他们都是行为型模式,但是他们是有区别的. 观察者模式 我的博客链接:机房收费系统之观察者模式. 观察者模式:一个目标物 ...
- event auto模式的问题
... 转载于:https://www.cnblogs.com/bluebbc/p/3196777.html
- 设计模式(3)行为型模式
行为型模式 行为模式负责对象间的高效沟通和职责委派. 行为型模式: 策略模式:将一组算法封装成一系列对象.通过传递这些对象可以灵活的改变程序的功能.比如说:java.util.Comparator#c ...
- java获取jsp 组件,利用Observer模式解决组件间通信问题-JSP教程,Java技巧及代码
1. 问题的提出 以前做一个界面的时候常常会遇到这样的尴尬情况:希望保留各个独立的组件(类),但又希望它们之间能够相互通信.譬如windows中的explorer,我们希望鼠标点击左边是树型目录的一个 ...
- laravel里面使用event
模式:大概是通过一个自定义的event,一个handler,还有一个binder,然后用来简化通知模型 生成自定义的event ./artisan make:event MyEvent 生成自定义的h ...
- Composite UI Application Block学习笔记之Event Broker
Composite UI Application Block着重于将应用逻辑和界面分开,让应用系统具备更清晰的结构,更强的扩展性.可移植性.在曹严明先生的讲座中,提及到了关于应用CAB开发的几个指导性 ...
最新文章
- Oracle中文乱码解决办法总结
- c++OpenCV操作mp4
- echo服务器(回显服务器)
- 订单生产计划表范本_生产计划管理与物料控制的实施步骤与要领
- 转:Fiddler抓包工具总结
- c 站点下html页面拦截器,HTML内容拦截器「HTML Content Blocker」
- 太强大了 | 一键生成,太强大了……
- 怎样三天训练出AI围棋大师?教你AlphaGo Zero的3个trick
- z-blog+php+漏洞,Z-Blog的PHP版前台存储型XSS漏洞一
- 微信H5开发-采坑记
- 迅盘从入门到精通 彻底告别WIN7关机烦恼 T400亲测
- HAOI2017 简要题解
- 乔治城大学计算机科学硕士2019,乔治城大学2019THE世界大学排名最新排名第109
- 【易通慧谷】通过一个案例两张概念图解析供应链金融
- 苹果手机测距离_苹果没说谎:iPhone和火星车都在用激光雷达
- vue生命周期(简短精干篇)
- 夏令时和时区最佳实践
- 298day(点触验证)
- 毛永胜计算机教师,中等职业学校网络计算机技术与应用
- Java回炉学习(一)