1. 程式人生 > >C語言和設計模式(觀察者模式)

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

【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱: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);
    }
}