Posted on 2008-05-16 02:38
Herbert 閱讀(385)
評論(0) 編輯 收藏 引用 所屬分類:
設計模式
Observer (觀察者)模式就是指一個被觀察對象對應多個觀察對象,當這個被觀察對象狀態改變時可以立即通知所有依賴于該對象的觀察對象。
舉個例子:
假如我要設計一個按鈕響應事件,當我按下按鈕時,在另外一個地方有個標簽上顯示“已經按了”。
最直接的想法是在按鈕類Button 里面創建一個標簽類的指針(如: Label* m_pLabel), 當按鈕按下時, 在按鈕的響應事件里面調用 m_pLabel, 使得它顯示 “已經按了”。
但這種做法只能局限于具體的兩個類:Button 和 Label, 如果我要Button 通知 Button或者其它類,則要再添加一個指向其它類的指針,這樣顯得很不整潔。觀察模式就可以解決這個問題,如下圖所示:

創建兩個基類: Informer (被觀察類) 和 Observer (觀察類)。
在Informer 里面有一個Observer對象的列表, 當Informer的狀態發生改變時,調用notify()方法,該方法的作用是遍歷Observer列表,并調用它們的 update(Informer*) 方法,使得該Informer對象對應的所有Observer對象都進行更新。當我們有一個類B要觀察類A的時候,就把
B 和 A 分別繼承于 Observer 和 Informer 。這樣,當A的屬性發生變化時,調用notify()方法,就可以調用到B的update()方法,從而達到通知的效果。
注意:
假設update()里面有個 Informer* pInfo的參數,不要為了方便,把pInfo 轉換成 Informer 的子類的指針,否則很容易使pInfo指針出錯。