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 回调函数触发
…详情请参照古月居