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

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