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