`
king_tt
  • 浏览: 2100447 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

设计模式介绍之七:观察者模式(observer)

 
阅读更多

观察者模式(又称发布/订阅模式)定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,,所有依赖于它的对象都得到通知并被自动更新。

常见的应用程序框架中有很多观察者模式的应用,比如 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;
}

好啦,以上就是观察者模式的一个简单实现。留心的人会在生活和软件系统中发现观察者模式的各种各样的具体应用(比如电话留言、QQ好友上线通知、安卓中的各种 Listener 接口)。


回顾一哈:


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics