传统模式下的观察者模式与信号/槽机制实现的观察者模式
实现代码如下:
#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);//第二次通知,只有一个监听者 }