观察者模式

来源:互联网 发布:天刀真武男捏脸数据 编辑:程序博客网 时间:2024/05/22 07:51


观察者模式: 观察者与被观察者可以是多对多的关系,一个观察者可以观察多个对象,一个对象也可以被多个观察者监视,鉴于此,写下了如下观察者模板:


被观察者:#pragma once#include "Observer.h"template<class T>class Observable{public:virtual ~Observable(){DetachFun<Observable<T>, Observer<T>> fun;fun.pT1 = this;std::for_each(m_observerList.begin(), m_observerList.end(), fun);m_observerList.clear();}/////////双向绑定///////////////////void Attach(Observer<T>* pObj){if (pObj){//加锁if (!HasObserver(pObj)){m_observerList.push_back(pObj);     pObj->Attach(this);}}}/////////双向解绑/////////////////void Detach(Observer<T>* pObj){//加锁std::list<Observer<T>*>::const_iterator ita = FindObserver(pObj);if (ita != m_observerList.end()){m_observerList.erase(ita);if (pObj){    pObj->Detach(this);}}}//////////单向解绑/////////////////void DetachUnilateral(Observer<T>* pObj){m_observerList.remove(pObj);}void Notify(T* pVal){std::list<Observer<T>*>::const_iterator ita = m_observerList.begin();while (ita != m_observerList.end()){(*ita)->Update(this, pVal);ita++;}}protected:inline typename std::list<Observer<T>*>::const_iterator FindObserver(Observer<T>* pObj){return std::find(m_observerList.begin(), m_observerList.end(), pObj);}inline bool HasObserver(Observer<T>* pObj){return m_observerList.end() != FindObserver(pObj);}protected:std::list<Observer<T>*> m_observerList;};


观察者:#pragma once#include <list>#include <algorithm>template<class T>class Observable;template<class T1, class T2>struct DetachFun{T1* pT1;void operator()(T2* pT2){if (pT2){pT2->DetachUnilateral(pT1);}}};template<class T>class Observer{public:virtual ~Observer(){DetachFun<Observer<T>, Observable<T>> fun;fun.pT1 = this;std::for_each(m_observableList.begin(), m_observableList.end(), fun);m_observableList.clear();}virtual void Update(Observable<T>* pObj, T* pVal){}////////双向绑定////////////////////////void Attach(Observable<T>* pObj){if (pObj){//加锁if (!HasObservable(pObj)){m_observableList.push_back(pObj);pObj->Attach(this);}}}//////////双向解绑///////////////////////void Detach(Observable<T>* pObj){//加锁std::list<Observable<T>*>::const_iterator ita = FindObservable(pObj);if (ita != m_observableList.end()){m_observableList.erase(ita);if (pObj){pObj->Detach(this);}}}//////////////单向解绑/////////////////////////void DetachUnilateral(Observable<T>* pObj){m_observableList.remove(pObj);}protected:inline typename std::list<Observable<T>*>::const_iterator FindObservable(Observable<T>* pObj){return std::find(m_observableList.begin(), m_observableList.end(), pObj);}inline bool HasObservable(Observable<T>* pObj){return m_observableList.end() != FindObservable(pObj);}protected:std::list<Observable<T>*> m_observableList;};



0 0
原创粉丝点击