观察者模式:有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
作用:在大的项目中,当一个对象的状态发生改变时可以通知其他相关的对象,这就可以用到观察者模式。用以将多种对象解偶。
实习原理:通过多态方式实现
.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