C++设计模式-观察者模式
来源:互联网 发布:日语输入法软件下载 编辑:程序博客网 时间:2024/06/10 06:20
该模式在Qt环境下编写,跟C++是一样;话说观察这模式对理解Qt的信号和槽的实现机制是很有用处的.........
被观察者的.h
#ifndef QOBSERVABLE_H#define QOBSERVABLE_H#include "qobserver.h"class QObservable{public: QObservable(); virtual ~QObservable(); // 注册观察者 void Attach(QObserver *pObs); // 注销观察者 void Detach(QObserver *pObs); // 注销所有观察者 void DetachAll(); // 若状态变化,则遍历所有观察者,逐个通知更新 void Notify(void *pArg = NULL); // 测试目标状态是否变化 bool HasChanged(); // 获取观察者数量 int GetObserversCount();protected: // 设置状态变化!!!必须继承QObervable才能设置目标状态 void SetChanged(); // 初始化目标为未变化状态 void ClearChanged();private: // 状态 bool m_bChanged; // set保证目标唯一性 QSet <QObserver*> m_setObs;};#endif // QOBSERVABLE_H
.cpp
#include <QDebug>#include "qobservable.h"QObservable::QObservable():m_bChanged(false){}QObservable::~QObservable(){}void QObservable::Attach(QObserver *pObs){ if(!pObs) return; m_setObs.insert(pObs);}void QObservable::Detach(QObserver *pObs){ if(!pObs) return; m_setObs.remove(pObs);}void QObservable::DetachAll(){ m_setObs.clear();}void QObservable::Notify(void *pArg){ if(!HasChanged()) return; qDebug()<<"notify Observers..."; ClearChanged(); QSet<QObserver*>::iterator itr = m_setObs.begin(); for(; itr != m_setObs.end(); itr++) { (*itr)->Update(this,pArg); }}bool QObservable::HasChanged(){ return m_bChanged;}int QObservable::GetObserversCount(){ return m_setObs.size();}void QObservable::SetChanged(){ m_bChanged=true;}void QObservable::ClearChanged(){ m_bChanged=false;}观察者的接口类:.h#ifndef QOBSERVER_H#define QOBSERVER_H#include <QObject>class QObservable;class QObserver{public: QObserver(); virtual ~QObserver(); //当被观察的目标发生变化时,通知调用该方法 //来自被观察者pObs,扩展参数为pArg virtual void Update(QObservable *pObs, void *pArg = NULL) = 0;};#endif // QOBSERVER_H
0 0
- 设计模式--观察者模式(C++)
- 设计模式--观察者模式(C++)
- 学习设计模式--观察者模式(C++)
- 设计模式--观察者模式(C++)
- 学习设计模式--观察者模式(C++)
- 设计模式----观察者模式Observer(C++)
- 设计模式之观察者模式(C++)
- 设计模式---观察者模式(C++)
- 设计模式之观察者模式(c++)
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- NUnit.Framework在VS2015中如何进行单元测试
- 声明式异常处理
- NodeJs上传文件至七牛
- 洛谷 P1031 均分纸牌
- - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds;
- C++设计模式-观察者模式
- 新的旅程
- Cocos2d-x 3.x 图形学渲染系列十八
- FragmentTabHost的初步使用
- 大一寒假不能浪费掉!
- 点击时在某个前面出现一个勾选选中的图标
- 在使用ThinkPHP时候数据更新的时候,save()方法返回值为0的问题!!!!
- Android PullToRefresh下拉刷新,上拉加载的使用详解
- ubuntu Google Chrome浏览器不能以root用户身份运行解决方案