C語言和設計模式(觀察者模式)

來源:互聯網
上載者:User

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】

    觀察者模式可能是我們在軟體開發中使用得比較多的一種設計模式。為什麼這麼說?大家可以聽我一一到來。我們知道,在windows的軟體中,所有的界都是由視窗構成的。對話方塊是視窗,菜單是視窗,工具列也是視窗。那麼這些視窗,在很多情況下要對一些共有的資訊進行處理。比如說,視窗的放大,視窗的減小等等。面對這一情況,觀察者模式就是不錯的一個選擇。

    首先,我們可以對這些共有的object進行提煉。

typedef struct _Object{    observer* pObserverList[MAX_BINDING_NUMBER];    int number;    void (*notify)(struct _Object* pObject);    void (*add_observer)(observer* pObserver);    void (*del_observer)(observer* pObserver);}Object;

    其實,我們需要定義的就是觀察者本身了。就像我們前面說的一樣,觀察者可以是菜單、工具列或者是子視窗等等。

typedef struct _Observer{    Object* pObject;    void (*update)(struct _Observer* pObserver);}Observer; 

    緊接著,我們要做的就是在Observer建立的時候,把observer自身綁定到Object上面。

void bind_observer_to_object(Observer* pObserver, Object* pObject){    assert(NULL != pObserver && NULL != pObject);    pObserver->pObject = pObject;    pObject->add_observer(pObserver);}      void unbind_observer_from_object(Observer* pObserver, Object* pObject){    assert(NULL != pObserver && NULL != pObject);    pObject->del_observer(observer* pObserver);    memset(pObserver, 0, sizeof(Observer));}

    既然Observer在建立的時候就把自己綁定在某一個具體的Object上面,那麼Object發生改變的時候,統一更新操作就是一件很容易的事情了。

void notify(struct _Object* pObject){    Obserer* pObserver;    int index;    assert(NULL != pObject);    for(index = 0; index < pObject->number; index++)    {        pObserver = pObjecet->pObserverList[index];        pObserver->update(pObserver);    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.