C++ 观察者模式

观察者模式有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

作用:在大的项目中,当一个对象的状态发生改变时可以通知其他相关的对象,这就可以用到观察者模式。用以将多种对象解偶。

实习原理:通过多态方式实现


.h文件:

<pre style="margin-top: 0px; margin-bottom: 0px;"><pre name="code" class="html">#include <QList>

class Subject;

class IObserver
{
public:
    virtual ~IObserver();

    virtual void receiveMsg(const bool &bIsChanged) = 0;
};

class Subject
{
public:
    virtual ~Subject();

    /**
     * @brief 对已注册的被观察者的更新通知
     *
     * @fn notify
     */
    virtual void notify();

    /**
     * @brief 在链表中添加被观察者
     *
     * @fn attach
     * @param IGGMObserver*被观察者的基类指针
     */
    virtual void attach(IObserver*) ;

    /**
     * @brief 从链表中移除被观察者
     *
     * @fn remove
     * @param IGGMObserver*被观察者的基类指针
     */
    virtual void remove(IObserver*);

    /**
     * @brief 设置状态
     *
     * @fn setState
     * @param bIsChanged需要设置状态的BOOL值
     */
    virtual void setState(const bool &bIsChanged);

    /**
     * @brief 返回当前的状态值
     *
     * @fn state
     * @return bool 当前状态的BOOL值
     */
    virtual bool state();
protected:
    Subject();
private:
    bool m_bIsChanged;
    QList<IObserver*> m_observers;
};


 
 
</pre><pre name="code" class="html">.cpp<pre name="code" class="html">
<pre name="code" class="html">#include "Observer.h"

void Subject::notify()
{
    QList<IObserver*>::Iterator iter = m_observers.begin();

    for (iter; iter != m_observers.end(); ++iter)
    {
        (*iter)->receiveMsg(this->state());
    }
}

void Subject::attach(IObserver *pObserver)
{
    m_observers.push_back(pObserver);
}

void Subject::remove(IObserver *pObserver)
{
    m_observers.removeAll(pObserver);
}

void Subject::setState(const bool &bIsChanged)
{
    m_bIsChanged = bIsChanged;
}

bool Subject::state()
{
    return m_bIsChanged;
}


IObserver::~IObserver()
{

}


Subject::~Subject()
{

}


Subject::Subject()
{

}

main.cpp文件:
 
<pre name="code" class="html">#include <QCoreApplication>
#include <qdebug.h>
#include "Observer.h"

class MyObserver: public IObserver
{
    virtual void receiveMsg(const bool &bIsChanged)
    {
        qDebug() << (bIsChanged ? QString("true") : QString("false") );
    }
};

class MySubject: public Subject
{

};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    MySubject *sub1 = new MySubject;
    MySubject *sub2 = new MySubject;

    MyObserver *observer = new MyObserver;

    sub1->setState(true);
    sub1->attach(observer);

    sub2->setState(false);
    sub2->attach(observer);

    sub1->notify();
    sub2->notify();

    return a.exec();
}


 
 Demo下载地址:http://download.csdn.net/detail/newborad/7714515 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值