观察者模式
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. (定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)
UML类图
C++代码实现
#include <iostream>
#include <list>
using namespace std;
class Observer {
public:
virtual void Updata() = 0;
};
class ConcreteObserverA : public Observer {
public:
void Updata() { cout << "观察者A已经被通知到更新" << endl; }
};
class ConcreteObserverB : public Observer {
public:
void Updata() { cout << "观察者B已经被通知到更新" << endl; }
};
class Subject {
public:
virtual void AddObserver(Observer* obs) { _observers.push_back(obs); }
virtual void DelObserver(Observer* obs) {
if (obs!=NULL)
_observers.remove(obs);
}
virtual void Notify() = 0;
protected:
list<Observer*> _observers;
};
class ConcreteSubject : public Subject {
public:
void Notify() {
typedef list<Observer* >::iterator ListIter;
for (ListIter iter=_observers.begin(); iter!=_observers.end(); iter++) {
(*iter)->Updata();
}
}
void DoSomething() {
cout << "被观察者进行了某项操作" << endl;
Notify();
}
};
#include "Observer.h"
int main()
{
//观察者
ConcreteObserverA* pObserverA = new ConcreteObserverA();
ConcreteObserverB* pObserverB = new ConcreteObserverB();
//被观察者
ConcreteSubject* pSubject = new ConcreteSubject();
pSubject->AddObserver(pObserverA);
pSubject->AddObserver(pObserverB);
pSubject->DoSomething();
delete pSubject;
delete pObserverB;
delete pObserverA;
return 0;
}
原来所谓的观察行为必须是得到被观察者同意的前提下才能进行。被观察者若是暴露狂则可以引发围观现象。但要是形成广播链的情况处理起来就棘手了,比如观察者同时又是被观察者的双重身份。