【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱: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); }}