Boost.signal传统模式下的观察者模式与信号/槽机制实现的观察者模式

传统模式下的观察者模式与信号/槽机制实现的观察者模式

实现代码如下:

#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);//第二次通知,只有一个监听者
}


猜你喜欢

转载自blog.csdn.net/knightonhourse/article/details/80251758