Observer模式
一、意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
二、适用性
1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2.当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
三、结构
四、代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <math.h>
#include <qxmlstream.h>
#include <QDebug>
#include <windows.h>
#include <unistd.h>
#include <QApplication>
class CObserver;
class CSubject
{
public:
virtual void Attach(CObserver* observer){}
virtual void Detach(CObserver* observer){}
virtual void Notify(){}
};
class CObserver
{
public:
virtual void Update(int subject){}
QString GetName()
{
return m_name;
}
protected:
QString m_name;
};
class CConcreteSubject : public CSubject
{
public:
CConcreteSubject()
{
m_vObserver.clear();
m_value = 20;
}
~CConcreteSubject()
{
m_vObserver.clear();
}
virtual void Attach(CObserver* observer)
{
m_vObserver.push_back(observer);
}
virtual void Detach(CObserver* observer)
{
std::vector<CObserver*>::iterator it = m_vObserver.begin();
for(; it != m_vObserver.end(); it++)
{
if((*it)->GetName() == observer->GetName())
{
m_vObserver.erase(it);
}
}
}
virtual void Notify()
{
for(int i = 0; i < m_vObserver.size(); i++)
{
m_vObserver[i]->Update(m_value);
}
}
private:
std::vector<CObserver*> m_vObserver;
int m_value;
};
class CConcreteObserver : public CObserver
{
public:
CConcreteObserver(QString name)
{
m_name = name;
}
virtual void Update(int subject)
{
qDebug("name:%s , update: %ld",
m_name.toStdString().c_str(), subject);
}
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
CConcreteSubject* subject = new CConcreteSubject();
CConcreteObserver *observer1 = new CConcreteObserver("One");
CConcreteObserver *observer2 = new CConcreteObserver("Two");
CConcreteObserver *observer3 = new CConcreteObserver("Three");
subject->Attach(observer1);
subject->Attach(observer2);
subject->Attach(observer3);
subject->Notify();
subject->Detach(observer2);
subject->Notify();
return app.exec();
}