定义:观察者模式,又叫发布-订阅模式。他定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
使用:一、当一个对象改变需要同时改变其他对象,同时它不知道具体有多少对象有待改变时,考虑观察者模式。
二、当一个抽象模型有两个方面,其中一方面依赖另一方面,这时用观察者模式可以将这两者封装在独立的对象中,使它们各自独立的改变或复用。观察者模式所作的工作 就是解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
UML结构图如下:
其代码如下:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Subject;
class Observer
{
protected:
Subject *m_pSubject;
public:
Observer(Subject *pSubject)
{
m_pSubject=pSubject;
}
public:
virtual void Update()=0;
};
class Subject
{
protected:
string m_action;
public:
void SetAction(string action)
{
this->m_action=action;
}
string GetAction()
{
return m_action;
}
public:
virtual void Attach(Observer *observer)=0;
virtual void Detach(Observer *observer)=0;
virtual void Notify()=0;
};
class ObserverA:public Observer
{
public:
ObserverA(Subject *pSubject):Observer(pSubject) {}
public:
void Update()
{
cout<<m_pSubject->GetAction()<<"\t观者者A作出相应"<<endl;
}
};
class ObserverB:public Observer
{
public:
ObserverB(Subject *pSubject):Observer(pSubject) {}
public:
void Update()
{
cout<<m_pSubject->GetAction()<<"\t观者者B作出相应"<<endl;
}
};
class boss:public Subject
{
private:
vector<Observer *>m_observers;
public:
void Attach(Observer *observer)
{
m_observers.push_back(observer);
}
void Detach(Observer *observer)
{
vector<Observer *>::iterator pos;
for (pos=m_observers.begin();pos!=m_observers.end();++pos)
{
if (*pos==observer)
{
m_observers.erase(pos);
break;
}
}
}
void Notify()
{
vector<Observer *>::iterator pos;
for (pos=m_observers.begin();pos!=m_observers.end();++pos)
{
(*pos)->Update();
}
}
};
void main()
{
boss subject;
ObserverA observerA(&subject);
ObserverB observerB(&subject);
subject.Attach(&observerA);
subject.Attach(&observerB);
subject.SetAction("第一次通知");
subject.Notify();
subject.Detach(&observerA);
subject.SetAction("第二次通知");
subject.Notify();
}