观察者模式之比喻:

有家公司,老板经常不按时上班,于是员工就可以在老板来之前的那段时间娱乐一下,但是又过的是心惊胆战,怕
老板随时出现;这是观察者模式就起作用了;公司有个前台,她总是第一个看到老板进门并且有时间通知大家的人,
于是员工都可以在前台那里登记一下,是否需要得到通知,其他事情也可以通过前台通知,比如说来了一个快递等;
实现代码如下:
 /**
* Define observer mode
*/
#include <iostream>
#include <list>
using namespace std; #ifndef NULL
#define NULL ((void*)0)
#endif // 各种消息的基类
class DOBject
{
public:
DOBject(int value){
value = value;
}
~DOBject();
private:
public:
/* data */
int value;
public:
/* Function */
bool operator ==(const DOBject &otherObject){
return (value==otherObject.value);
}
};
// 类员工类
class DListener
{
public:
DListener(/*arguments*/);
~DListener();
/* data */
/* Respond to notify */
public:
void OnNotify(DObject *object)
{
// Do something
return ;
}
};
// 类前台类
class DObserverObject
{
public:
DObserverObject(/*arguments*/){
m_pListeners = new List<DListener*>();
m_pObject = new DObject();
}
~DObserverObject(){
if (NULL != m_pObject)
{
/* code */
delete m_pObject;
}
if (NULL != m_pListeners)
{
/* 需要循环把list里面的注册者都清理掉 */
for(int i=, count=m_pListeners->size(); i < count; ++i){
delete m_pListeners->get(i);
m_pListeners->get(i) = NULL;
}
delete m_pListeners;
}
}
// 员工注册
void Registe(DListener *newListener){
m_pListeners->add(newListener);
}
// 取消注册
void UnRegiste(DListener *newListener){
m_pListeners->remove(newListener);
}
//通知员工
void SendNotify(void){
for (int i = ; i < m_pListeners.size(); ++i)
{
/* 需要循环将所有注册的员工都通知到 */
m_pListeners[i]->OnNotify(m_pObject);
}
}
// 一般对于这个有俩种传递数据的方式,推或者拉
// 对于推方式,则SendNotify需要加参数;
// 对于拉方式,则SendNotify不需要参数,由员工自己通过GetValue去取
DObject *GetValue(void){
return m_pObject;
}
//发生了什么事情,老板来了,或者快递来了
void SetValue(DObject *newObject){
if (m_pObject!=*newObject)
{
/* code */
m_pObject->value = newObject->value;
SendNotify(newObject);
}
}
/* data */
private:
List<DListener*> *m_pListeners;
DObject *m_pObject;
};

对于以上代码可能对于list的使用存在问题,还未完全测试,有兴趣的可以自己进行测试,也可以自己自己采用其他数据结构!

谢谢!

05-11 17:45