觀察者模式定義一種一對多的依賴關係,讓多個觀察者物件同時監聽某一種主題物件,這個主題物件在狀態發生變化時,會通知所有觀察者物件,使他們能夠自動更新。
也就是說乙個類物件可以有多個監聽,當某乙個屬性或者方法發生變化,對應的多個監聽就被觸發,執行各自方法,實現更新。
解決思路:
定義乙個觀察者模式介面,其實現類可以匿名呼叫,也可建立乙個實現類。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 觀察者模式(行為型)
定義物件間的一種一對多的依賴關係,以便當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通 知並自動更新 在軟體構建過程中,我們需要為某些物件建立一種 通知依賴關係 乙個物件 目標物件 的狀態發生改變,所有的依賴物件 觀察者物件 都將得到通知。如果這樣的依賴關係過於緊密,將使軟體不能很好地抵禦變化...