观察者模式
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; }
原来所谓的观察行为必须是得到被观察者同意的前提下才能进行。被观察者若是暴露狂则可以引发围观现象。但要是形成广播链的情况处理起来就棘手了,比如观察者同时又是被观察者的双重身份。