传统模式下的观察者模式与信号/槽机制实现的观察者模式
实现代码如下:
#include <iostream>
#include <list>
using namespace std;
#include "boost/shared_ptr.hpp"
#include "boost/signal.hpp"
using namespace boost;
//观察者基类
class CAbsObserver{
public:
virtual void Update(int data) = 0;
};
//观察者类A
class CObserverA : public CAbsObserver{
public:
void Update(int data){ cout << "ObserverA.Update(" << data << ")" << endl;}
//使用函数对象来实现
void operator()(int data){ cout << "ObserverA.Slot : " << data << endl;}
};
//观察者类B
class CObserverB : public CAbsObserver{
public:
void Update(int data){ cout << "ObserverB.Update(" << data << ")" << endl;}
//使用函数对象来实现
void operator()(int data){ cout << "ObserverB.Slot : " << data << endl;}
};
//被观察的主题
class CSubject{
private:
list<shared_ptr<CAbsObserver>> lstObserver;
public:
//注册观察者
bool Attach(const shared_ptr<CAbsObserver>& ptrobj){lstObserver.push_back(ptrobj); return true;}
//取消注册观察者
bool Detach(const shared_ptr<CAbsObserver>& ptrobj){
for(list<shared_ptr<CAbsObserver>>::iterator it = lstObserver.begin(); it != lstObserver.end(); it++){
if((*it) == ptrobj){
lstObserver.erase(it);
return true;
}
}
return false;
}
//通知观察者
void Notify(int data){
for(list<shared_ptr<CAbsObserver>>::iterator it = lstObserver.begin(); it != lstObserver.end(); it++){
(*it)->Update(data);
}
}
};
void main()
{
cout << "传统模式下的观察者模式:" << endl;
shared_ptr<CSubject> poSubject(new CSubject);//被观察的主题对象
shared_ptr<CAbsObserver> poObserverA(new CObserverA);
shared_ptr<CAbsObserver> poObserverB(new CObserverB);
poSubject->Attach(poObserverA);//注册观察者CObserverA
poSubject->Attach(poObserverB);//注册观察者CObserverB
poSubject->Notify(110);//第一次通知:有两个监听者
poSubject->Detach(poObserverA);//取消注册观察者CObserverB
poSubject->Notify(120);//第二次通知,只有一个监听者
cout << "信号/槽机制实现的观察者模式:" << endl;
signal<void (int)> oSignal;// 被观察的主题对象
signals::connection oConnA = oSignal.connect(CObserverA());//注册观察者CObserverA
signals::connection oConnB = oSignal.connect(CObserverB());//注册观察者CObserverB
oSignal(110);//第一次通知:有两个监听者
oConnA.disconnect();//取消注册观察者CObserverB
oSignal(120);//第二次通知,只有一个监听者
}
#include