觀察者模式(OBSERVER)

2021-04-01 18:26:56 字數 3059 閱讀 3934

觀察者模式是我選擇將其列出來的第乙個模式。看了這個模式的概念之後,有種豁然開朗的感覺。工作也由實踐上公升到了理論。平時使用的各種

.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...