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
原创粉丝点击