观察者模式
来源:互联网 发布:天刀真武男捏脸数据 编辑:程序博客网 时间: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
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- PHP 中的设计模式详解
- 初识JS
- 学生成绩管理系统java结业项目
- 在浏览器中禁止复制与粘贴
- 自己对互斥和同步的理解
- 观察者模式
- **[Lintcode]Unique Binary Search Trees II 不同的二叉查找树 II
- cuda编程入门示例3---数组求和
- 编译BFS出现aclocal.m4和Error: unknown pseudo-op: `.ule'的错误
- 30天自制操作系统day3-HLT实现
- 协方差矩阵的意义
- linux fedora 24 source 读取 配置文件 例如 profile
- 用VIM替换掉文件内容里的“\r\n”
- [UNIX系统编程] I/O缓冲