第20章觀察者模式
內(nèi)容來自尚硅谷Java設(shè)計(jì)模式(圖解+框架源碼剖析)_嗶哩嗶哩_bilibili
寫在前面:本文內(nèi)容大致和原視頻內(nèi)老師的筆記內(nèi)容相同,會(huì)偶爾插入自己的注釋和理解,盡量會(huì)完成作業(yè)
兄弟們!學(xué)就完事了!加油!奧里給!
第20章觀察者模式
20.1天氣預(yù)報(bào)項(xiàng)目需求,具體要求如下
1)????? 氣象站可以將每天測(cè)量到的溫度,濕度,氣壓等等以公告的形式發(fā)布出去(比如發(fā)布到自己的網(wǎng)站或第三方)。需要設(shè)計(jì)開放型API,便于其他第三方也能接入氣象站獲取數(shù)據(jù)。
2)????? 提供溫度、氣壓和濕度的接口
3)????? 測(cè)量數(shù)據(jù)更新時(shí),要能實(shí)時(shí)的通知給第三方
?
20.2天氣預(yù)報(bào)設(shè)計(jì)方案 1-普通方案
20.2.1WeatherData類
傳統(tǒng)的設(shè)計(jì)方案


代碼實(shí)現(xiàn)
?? 問題分析
其他第三方接入氣象站獲取數(shù)據(jù)的問題
無法在運(yùn)行時(shí)動(dòng)態(tài)的添加第三方(新浪網(wǎng)站)
違反ocp原則->觀察者模式
在WeatherData中,當(dāng)增加一個(gè)第三方,都需要?jiǎng)?chuàng)建一個(gè)對(duì)應(yīng)的第三方的公告板對(duì)象,并加入到dataChange,不利于維護(hù),也不是動(dòng)態(tài)加入
public void dataChange(){
??????? //調(diào)用接入方的update方法
??????? currentConditions.update(getTemperature(),getPressure(),getHumidity());
}
?
20.3觀察者模式的基本原理
1)????? 觀察者模式類似訂牛奶業(yè)務(wù)
2)????? 奶站/氣象局:Subject
3)????? 用戶/第三方網(wǎng)站:Observer
?? Subject:登記注冊(cè)、移除和通知
1)????? registerObserver注冊(cè)
2)????? removeObserver移除
3)????? notifyObservers()通知所有的注冊(cè)的用戶,根據(jù)不同需求,可以是更新數(shù)據(jù),讓用戶來取,也可能是實(shí)施推送,看具體需求定
?? Observer:接收輸入
?? 觀察者模式:對(duì)象之間多對(duì)一依賴的一種設(shè)計(jì)方案,被依賴的對(duì)象為Subject,依賴的對(duì)象為Observer,Subject通知Observer變化,比如這里的奶站是Subject,是1的一方。用戶時(shí)Observer,是多的一方。
20.4觀察者模式解決天氣預(yù)報(bào)需求
20.4.1類圖說明

20.4.2代碼實(shí)現(xiàn)
20.4.3觀察者模式的好處
1)????? 觀察者模式設(shè)計(jì)后,會(huì)以集合的方式來管理用戶(Observer),包括注冊(cè),移除和通知。
2)????? 這樣,我們?cè)黾佑^察者(這里可以理解成一個(gè)新的公告板),就不需要去修改核心類WeatherData不會(huì)修改代碼,遵守了ocp原則。
20.5觀察者模式在Jdk應(yīng)用的源碼分析
1)????? Jdk的 Observable類就使用了觀察者模式
2)????? 代碼分析+模式角色分析

Observable的作用和地位等價(jià)于我們前面講過Subject
Observable是類,不是接口,類中已經(jīng)實(shí)現(xiàn)了核心的方法 ,即管理Observer的方法 add..delete ..notify...
Observer 的作用和地位等價(jià)于我們前面講過的Observer,有update
Observable 和Observer的使用方法和前面講過的一樣,只是Observable是類,通過繼承來實(shí)現(xiàn)觀察者模式