观察者模式(Observer)又称 订阅者模式(Subscriber),是一个发布者对应多个观察者,就像 微博、邮件订阅一样,只有订阅该新闻的用户才能够收取到该信息,类图定义:
发布者(Publisher)内部保存了一个观察者对象列表(Observer),当发布者属性发生变化时,调用notify通知观察者,提示信息变化。
模式的实现比较简单,我们定义两个基类 Publisher 和 Observer,实现虚拟接口:
/** Publisher基类*/
#ifndef _PUBLISHER_H_
#define _PUBLISHER_H_
#include "Observer.h"
#include <set>
class Publisher
{
public:
Publisher(){}
virtual ~Publisher(){}
void addObserver(Observer* pObserver){ m_setObserver.insert(pObserver); }
void removeObserver(Observer* pObserver)
{
std::set<Observer*>::iterator ite = m_setObserver.find(pObserver);
if( ite!=m_setObserver.end() )
m_setObserver.erase(ite);
}
virtual void onNotify(void* msg)
{
std::set<Observer*>::iterator ite = m_setObserver.begin();
for(; ite!=m_setObserver.end(); ++ite)
{
if(*ite)
(Observer*)(*ite)->notify(this, msg);
}
}
protected:
std::set<Observer*> m_setObserver;
};
#endif // _PUBLISHER_H_
/** Observer基类*/
#ifndef _OBSERVER_H_
#define _OBSERVER_H_
class Publisher;
class Observer
{
public:
Observer(){}
~Observer(){}
virtual void notify(Publisher* pPub, void* msg) = 0;
};
#endif // _OBSERVER_H_
用户使用时需要对上面两个基类进行继承即可,这里面需要注意的事项有两点:
1. 发布者在变化时,或者用户调用onNotify传入数据;
2. 观察者需要实现notify,并且需要预先知道发布者的消息(msg)格式,以便于消息的解析。