今天来学习一下观察者模式,下面看一下C++的实现。
#include <iostream>
#include <string>
#include <string.h>
#include <list>
#include <math.h>
#include <stdlib.h>
using namespace std;
//观察者模式
class Observer //观察者
{
public:
virtual void Update() {}
};
class Subject //通知者
{
public:
void Attach(Observer *ob)
{
pob.push_back(ob);
}
void Detach(Observer *ob)
{
pob.remove(ob);
}
void Notify()
{
list<Observer*>::iterator iter = pob.begin();
for(; iter != pob.end(); iter++)
(*iter)->Update();
}
private:
list<Observer *> pob; //观察者链表
protected:
string m_status; //状态
};
class ConcreteSubject : public Subject //通知者
{
public:
ConcreteSubject (string name)
{
m_name = name;
}
string getSubjectState()
{
return m_status;
}
void setSubjectState(string state)
{
m_status = state;
}
private:
string m_name;
};
class ConcreObserver : public Observer //观察者
{
private:
string m_name; //观察者姓名
ConcreteSubject *m_subject; //通知者对象
public:
ConcreObserver(ConcreteSubject *subject,string name)
{
m_subject = subject;
m_name = name;
}
void Update()
{
string status = m_subject->getSubjectState();
cout << m_name << "的状态是" << status << endl;
}
};
int main()
{
ConcreteSubject *s = new ConcreteSubject("12"); //通知者
ConcreObserver *s1 = new ConcreObserver(s,"X");
s->Attach(s1);
s->setSubjectState("ABC");
s->Notify();
delete s;
delete s1;
return 0;
}
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
上述代码中只添加了一个观察者,也可以添加多个观察者,用list存起来,通知的时候再遍历list中的观察者。通知者能设置状态,并提供获取状态的函数,观察者在接收到通知之后调用这个函数获取当前状态。
适用场景:当一个类的改变需要同时改变其他对象的时候,而且它不知道有多少对象有待改变时
参考资料:大话设计模式