-
基本骨架:
Subject
abstract?class?Subject?{ ????private?List<Observer>?observerList?=?new?ArrayList<>(); ???? ????public?void?attach(Observer?o){observerList.add(o);} ????public?void?detach(Observer?o){observerList.remove(o);} ????public?void?inform(){observerList.forEach(o?->?o.update(this));} }
Observer
interface?Observer?{ ????void?update(Subject?subject); }
簡單模擬實現(xiàn):
具體事物
class?ConstructSubject?extends?Subject?{ ????private?String?status; ???? ????public?String?getStatus(){return?status;} ???? ????public?void?setStatus(String?status){ ????????this.status?=?status; ????????this.inform();?//?事物發(fā)生變化,通知更新 ????} }
觀察者實現(xiàn)
class?ConstructObserver?implements?Observer?{ ????String?status; ????@Override ????public?void?update(Subject?subject)?{ ????????this.status?=?((ConstructSubject)subject).getStatus(); ????} }
總結(jié):Subject在設(shè)計模式中占主動地位,Observer可輔助Subject進行額外功能處理
查看全部 -
Subject : 觀察源事物,可添加或刪除自身觀察者
Observer : 觀察者,可接受事物的通知
當事物發(fā)生更新變動,則通知觀察者做相應(yīng)處理,另事物狀態(tài)與觀察者狀態(tài)保持一致
查看全部 -
創(chuàng)建、注冊階段
查看全部 -
客戶端操作
查看全部 -
觀察者實現(xiàn)的兩種模式:
區(qū)別:
推模型假定目標知道觀察者需要的數(shù)據(jù)
拉模型不知道目標對象需要什么數(shù)據(jù),把自身傳遞給觀察者,由觀察者取值
推模型使觀察者對象復(fù)用性比較差
查看全部 -
使用觀察者模式的情況
查看全部 -
適用情況:
查看全部 -
優(yōu)點: 1,觀察者模式實現(xiàn)了觀察者和目標之間的抽象耦合; 2,觀察者模式實現(xiàn)了動態(tài)聯(lián)動 3,觀察者模式支持廣播通信 缺點: 可能會引起無謂的操作---->引起誤更新
查看全部 -
Observable類的notifyObservers()方法只支持拉的方式,而另一個重載方法notifyObservers(Object content)方法兩種方式(推的方式和拉的方式)都支持,所以在第二個時兩種都生效
查看全部 -
Java實現(xiàn)與自己實現(xiàn)的對比:
查看全部 -
利用Java提供的觀察者模式:
java.util.Observable類和java.util.Observer接口
Java實現(xiàn)與自己實現(xiàn)的對比:
查看全部 -
觀察者模型的實現(xiàn)方式:
一、推模型
? ? 目標對象主動向觀察者推送目標的詳細信息,推送的信息通常是目標對象的全部或部分數(shù)據(jù)
二、拉模型
? ? 目標對象在通知觀察者的時候,只傳遞少量信息。
? ? 若觀察者需要更具體的信息,由觀察者主動到目標對象中獲取,相當于觀察者從目標對象中拉數(shù)據(jù)。
? ? 一般會把目標對象自身通過update方法傳遞到觀察者
比較:
1、推模型是假定目標對象知道觀察者需要的數(shù)據(jù);拉模型不知道observer需要什么數(shù)據(jù),因此把自身傳給observer,由觀察者來取值
2、推模型使observer對象難以復(fù)用,拉模型傳遞的是目標對象本身,滿足各種需要
查看全部 -
認識觀察者模式:
1、目標與觀察者之間的關(guān)系
? ?一對一、一對多、多對一(觀察者需要定義多個update方法用于區(qū)分)
2、單項依賴
? ?觀察者依賴目標,觀察者一直在等待目標的通知
3、命名建議
? ?觀察者模式又被稱為發(fā)布訂閱模式
? ?①目標接口的定義,名稱加Subject后綴
? ?②觀察者接口的定義,名稱加Observer后綴
? ?③觀察者接口的更新方法,名稱為update
4、觸發(fā)通知的時機
? ?先修改狀態(tài)再通知,否則會導(dǎo)致狀態(tài)不一致
5、觀察者模式的調(diào)用順序示意圖
? ?①準備階段
創(chuàng)建目標對象-》創(chuàng)建觀察者對象-》向目標對象注冊觀察者對象
? ?②運行階段
改變目標對象的狀態(tài)-》通知所有注冊的觀察者對象進行相應(yīng)的處理-》回調(diào)目標對象,獲取相應(yīng)的數(shù)據(jù)
6、通知的順序
? ?多個觀察者之間是沒有先后順序的
查看全部 -
通用代碼:
查看全部 -
觀察者模式的設(shè)計圖
查看全部
舉報