该模式在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
观察者的接口类:.h#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; }
#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