观察者模式(又称发布/订阅模式)定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,,所有依赖于它的对象都得到通知并被自动更新。
常见的应用程序框架中有很多观察者模式的应用,比如 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;
- }
819



被折叠的 条评论
为什么被折叠?



