行為型設計模式 觀察者模式

2021-09-26 22:40:33 字數 2118 閱讀 4092

觀察者模式定義一種一對多的依賴關係,讓多個觀察者物件同時監聽某一種主題物件,這個主題物件在狀態發生變化時,會通知所有觀察者物件,使他們能夠自動更新。

也就是說乙個類物件可以有多個監聽,當某乙個屬性或者方法發生變化,對應的多個監聽就被觸發,執行各自方法,實現更新。

解決思路:

定義乙個觀察者模式介面,其實現類可以匿名呼叫,也可建立乙個實現類。observer介面,有方法update(),可以有很多的方法,當所觀察物件發生變化,就執行該方法。

定義乙個實體類,並建立有observer類屬性,建立乙個註冊方法,類似於set方法,外部傳入乙個觀察者,將觀察者註冊到該類。

實體類會有一些方法,我們將observer的update()方法放入到需要觀察的方法中,這樣,當對應方法發生變化的時候,就會呼叫update方法,觀察者也就得到了訊息,進行改變。

**實現,這裡使用偵聽機制,其中subject類是user使用者類,observer類是userlistener,用於偵聽,進行簡單的實現。

//user類

public

class

user

public

user

(string username)

//註冊偵聽器,其實就是乙個set方法

public

void

setuserlistener

(userlistener userlistener)

public

void

delete()

public userlistener getuserlistener()

public string getusername()

public

void

setusername

(string username)

}//偵聽介面userlistener

public

inte***ce

userlistener

//測試方法

public

class

usertest

}/*列印結果*/

jack刪除了賬戶

觀察到刪除了賬戶

lucy刪除了賬戶

觀察到刪除了賬戶

改進思路:

但是這樣寫的話,會無法判斷誰刪除了賬戶,所以需要將讓update方法有引數,傳入的還是對應的類物件。

第一種辦法,使用泛型。

//偵聽介面

public

inte***ce

userlistener

//user類中的delete方法

public

void

delete()

//測試

userlistener userlistener =

(t)-

> system.out.

println

("觀察到"

+ t +

"刪除了賬戶"

);

第二種辦法,單獨建立乙個事件引數,該方法**主要是web開發中的***機制。

//eventargs,都是構造方法和set和get方法

public

class

eventargs

public

eventargs

(object source)

public object getsource()

public

void

setsource

(object source)

}//監聽介面

public

inte***ce

userlistener

//user類中的delete方法

public

void

delete()

//測試

userlistener userlistener =

newuserlistener()

};

觀察者模式(行為型)

1.1定義 觀察者模式 定義物件之間的一種一對多依賴關係,使得每當乙個物件狀態發生改變時,其相關依賴物件都得到通知並被自動更新。觀察者模式的定義說明 1.2角色 觀察者模式包含以下4個角色 1.3優點 1.4缺點 1.5適用環境 1.6教學例子 1 分析 軟體系統 乙個物件的狀態或行為的變化將導致其...

設計模式筆記 19 觀察者模式(行為型)

定義物件間的一種一對多的依賴關係,以便當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通 知並自動更新 在軟體構建過程中,我們需要為某些物件建立一種 通知依賴關係 乙個物件 目標物件 的狀態發生改變,所有的依賴物件 觀察者物件 都將得到通知。如果這樣的依賴關係過於緊密,將使軟體不能很好地抵禦變化...

設計模式筆記 19 觀察者模式(行為型)

定義物件間的一種一對多的依賴關係,以便當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通 知並自動更新 在軟體構建過程中,我們需要為某些物件建立一種 通知依賴關係 乙個物件 目標物件 的狀態發生改變,所有的依賴物件 觀察者物件 都將得到通知。如果這樣的依賴關係過於緊密,將使軟體不能很好地抵禦變化...