您好,登錄后才能下訂單哦!
觀察者模式
觀察者模式定義了對象之間的一對多依賴,這樣一來,當(dāng)一個(gè)對象改變狀態(tài)時(shí),它的所有依賴者都會(huì)收到通知并自動(dòng)更新。一方可稱為主題(subject),另一方可稱為觀察者(observer),一個(gè)主題可擁有多個(gè)觀察者。當(dāng)主題的數(shù)據(jù)有變動(dòng)時(shí),就會(huì)通知所有訂閱了它的觀察者。在這之后的操作有兩種:
推:主題直接將數(shù)據(jù)推送給所有觀察者。
拉:主題通知了所有觀察者后,每個(gè)觀察者再根據(jù)自己的需要從主題拉取所需數(shù)據(jù)。
現(xiàn)實(shí)中的列子: 報(bào)紙出版社+訂閱者=觀察者模式,找工作+獵頭=觀察者模式
概念圖:
UML圖:
我們看一個(gè)列子吧
需求:Internet氣象站需求
描述:跟蹤氣象站的數(shù)據(jù),有變化時(shí)更新WeatherData對象,并最新信息顯示在對應(yīng)的顯示器上,如下:
我們分析需求:
1. 一對多關(guān)系(不同的數(shù)據(jù)顯示在對應(yīng)的布告板上,如:濕度,溫度等)。
2. 氣象數(shù)據(jù)有變化時(shí)更新最新值并顯示在布告板。
很適合觀察者模式來實(shí)現(xiàn),最終實(shí)現(xiàn)的UML圖如下(代碼省略):
JAVA內(nèi)置支持觀察者模式
注意:JAVA內(nèi)置支持觀察者模式,Subject是類不是接口,導(dǎo)致必須用繼承,java本身不支持多繼承,所以導(dǎo)致層次問題,不靈活。建議自己實(shí)現(xiàn)。
java.util.Observable(主題)
java.util.Observer(觀察者)
我們用內(nèi)置方法實(shí)現(xiàn)上面的列子,類圖如下:
總結(jié);
觀察者模式的應(yīng)用場景:
1、 對一個(gè)對象狀態(tài)的更新,需要其他對象同步更新,而且其他對象的數(shù)量動(dòng)態(tài)可變。
2、 對象僅需要將自己的更新通知給其他對象而不需要知道其他對象的細(xì)節(jié)。
設(shè)計(jì)原則:為了交互對象之間的松耦合設(shè)計(jì)而努力。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。