观察者模式(又称发布/订阅模式)定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,,所有依赖于它的对象都得到通知并被自动更新。
常见的应用程序框架中有很多观察者模式的应用,比如 MFC 的 Doc/View ,Qt 中的信号与槽、 Model/View Architecture,安卓中的广播接收者( Broadcast Receiver )。
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变;当一个对象必须通知其它对象,而它又不能假定其它对象是谁,换言之, 你不希望这些对象是紧密耦合的;……这些场景下都可以使用观察者模式。
下图是观察者模式的 UML 表示:
下面提供一个观察者模式的实例。这个实例描述的是这么一个情况:有人想看花,希望花开的时候能够得到通知。
先看目标和观察者接口的声明:
class BloomObserver{ public: BloomObserver(); virtual ~BloomObserver(); virtual void bloomed() = 0; }; class Rose{ public: Rose(); ~Rose(); void attach(BloomObserver *pObserver); void detach(BloomObserver *pObserver); void notify(); void setBloomed(); bool bloomed(); private: bool m_bBloomed; BloomObserverList m_observers; };
Rose::Rose():m_bBloomed(false) {} void Rose::attach(BloomObserver *pObserver){ m_observers.add(pObserver); } void Rose::detach(BloomObserver *pObserver){ m_observers.remove(pObserver); } void Rose::notify(){ foreach(BloomObserver *observer, m_observers) observer->bloomed(); } void Rose::setBloomed(){ m_bBloomed = true; notify(); } bool Rose::bloomed(){ return m_bBloomed; }
class ObserverA : public BloomObserver{ void bloomed(){ callFriendsDriveCarToSomewhere(); } }; class ObserverB : public BloomObserver{ void bloomed(){ writeBlog(); } }; class ObserverC : public BloomObserver{ void bloomed(){ takeCameraToSomewhere(); } };
int main(int argc, char**argv){ Rose rose; ObserverA *a = new ObserverA; ObserverB *b = new ObserverB; ObserverC *c = new ObserverC; rose.attach(a); rose.attach(b); rose.attach(c); //doSomethingHere(); rose.setBloomed(); rose.detach(a); rose.detach(b); rose.detach(c); delete a; delete b; delete c; return 0; }
原文:http://blog.csdn.net/foruok/article/details/19422141