觀察者模式是我選擇將其列出來的第乙個模式。看了這個模式的概念之後,有種豁然開朗的感覺。工作也由實踐上公升到了理論。平時使用的各種
.net
控制項都使用了這種模式,將這種模式應用到組成乙個系統的各個元件中去,怎乙個「妙
」字了得。理解了它之後,不竟又對
.net
的框架敬佩有佳。不知道這其中隱藏了多少未知的閃光思想。我決定在此板塊中將閃光點一一遍歷,也歡迎志同道合者一同研究。
一、模式定義:觀察者模式的目的是在物件之間定義乙個一對多的依賴關係,當乙個物件狀態發生改變時,所有依賴於這個物件的物件都能夠得到通知,並對上述改變做出反應。
二、應用場景:當乙個物件的狀態發生變化時,使用該物件的客戶(也就是模式使用者)能夠感知這種變化,並有能力查詢它所感興趣的物件屬性資訊。
三、常見應用:在
windows forms
應用程式中,按鈕(
button
)類的單擊事件(
click
)。this
.button1.click +=new eventhandler(processbtnclick);
這行**利用
c#對觀察模式的支援建立了對按鈕控制項的觀察。
四、關鍵積累:理解和掌握
c#中委託和事件的工作機制。(
ref: professional c# 3rd edition,p148
)五、設計實現:通過
c#的委託機制,我們定義乙個
observer
類和target
類的互動方式。下面是實現該機制的委託宣告:
public
delegate
void changehandler();
該宣告規範了乙個需要進行**的方法的簽名(
signature
)。使用委託的意義就在於此。下面給出了乙個實現的設計圖。
圖1:觀察者模式(
observer
)實現的設計圖
observer
類包含的方法
react()
匹配了changehandler
**(委託)型別的簽名(虛線空心三角箭頭),其實例可能依賴於乙個
changehandler
**型別的例項(虛線開放箭頭),並通過它接收
target
類物件例項發生變化時產生的通知。
target
類則使用了
changehandler
**(委託)型別的乙個例項。注意
changehandler
**型別的方法只規範了引數(不帶引數)和返回型別(
void
),並沒有提供方法的名稱。這樣的機制使得程式可以使用任何匹配的方法來例項化該委託型別。
target
類包括了乙個型別為
changehandler
,名為change
的字段。
change
欄位是乙個事件。將其標記為事件的好處是,
c#可以限制對事件的訪問。如果不加這種限制,任何訪問乙個
target
物件的方法都可以呼叫
change
委託。該類的實現**如下:
public
class target
public
void wiggle()
}一旦
target
類的wiggle()
方法得到執行,這段**就可以使所有對
target
類感興趣的類都得到通知。
現在的問題是:
observer
類的**如何用乙個方法進行**,從而例項化
changehandler
的**型別,並且把這個**例項加入到
change
變數中去。
要理解和解決這個問題,我們再分析一下委託型別的繼承關係。如圖
1所示,委託型別同時也是乙個
system.delegate
類的派生類。它所繼承的重要行為之一是提供了將委託例項進行組合的功能。例如,
observer
類的建構函式例項化了
changehandler
委託型別,並且用乙個
target
物件的change
委託(成員屬性)與這個新的委託例項進行了組合。示例**如下:
public
class observer
public
void react()
}
observer
類的建構函式建立的委託例項封裝了
observer
物件的react()
方法。當執行
observer
類的建構函式時,
target
物件的change
委託可能為
null
,這時,
change
委託可以將
observer
物件加入的委託簡單地設定為某個具體值。乙個委託變數可以持有多個委託例項。
我們測試一下這種模式,在乙個窗體中放置乙個按按鈕
button1
,在其單擊(
click
)事件中新增如下**:
private
void button1_click(object sender, system.eventargs e)
首先**建立了
target
類的例項,接著建立了
observer
類的例項,並將
target
例項作為引數傳入
observer
類的建構函式中,完成
target
例項的change
委託與新建立的委託例項的組合。最後,呼叫
target
例項的wiggle()
方法,該方法又呼叫了乙個委託,委託呼叫
observer
物件的react()
方法,最終彈出對話方塊顯示最終結果。
觀察者模式 Observer
個人理解 觀察者模式的核心是subject的attach和detach方法,載入observer物件 uml類圖 實現 public abstract class subject public void detach observer observer public void notify publ...
觀察者模式 ObServer
觀察者模式 observer 定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新 觀察者模式 observer 觀察者模式定義了一對多依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。讓主題物件在狀態發生變化時,會通知所有觀察者物件,讓他們能夠自動...
Observer 觀察者模式
觀察者模式 inte ce subject class loginsubject implements subject public function detach observer observer self observers newobservers public function notif...