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

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