小記觀察者模式

《Head First 設(shè)計(jì)模式》隨手筆記
觀察者模式的定義:在對(duì)象之間定義一對(duì)多的以來(lái),這樣一來(lái),當(dāng)一個(gè)對(duì)象改變狀態(tài),以來(lái)它的對(duì)象都會(huì)收到通知,并自動(dòng)更新。
舉個(gè)例子
氣象站要根據(jù)收集到的天氣信息進(jìn)行分析,發(fā)布天氣情況到三個(gè)顯示不同信息的布告板,而且這個(gè)布告板必須實(shí)時(shí)更新。
在設(shè)計(jì)的時(shí)候我們可以想,如果這個(gè)我想要一個(gè)不僅可以讓氣象臺(tái)發(fā)布情況的一個(gè)項(xiàng)目,我還想這個(gè)模版可以被廣播臺(tái)使用,那我需要一個(gè)“主題”來(lái)使得我可以將這個(gè)模版應(yīng)用到不同的場(chǎng)景。
所以我可以做以下設(shè)計(jì):

首先是設(shè)計(jì)主題
Subject<interface>(主題模版,用來(lái)對(duì)觀察者進(jìn)行操作,像是增加刪除通知觀察者)
registerObserver();
removeObserver();
notifyObservers();
WeatherData<class>(Subject的實(shí)現(xiàn)類,用來(lái)實(shí)現(xiàn)主題,像是氣象臺(tái)所需的天氣信息主題,或者是廣播臺(tái)所需的節(jié)目信息等等)
registerObserver();
removeObserver();
notifyObservers();
然后是設(shè)計(jì)觀察者
Observer<interface>(觀察者模版,用來(lái)接受主題的更新通知和吸收主題給到的信息,并對(duì)信息進(jìn)行自定義處理)
update();
DisplayElement<interface>(觀察者模版,用來(lái)顯示接受觀察者進(jìn)行處理之后的信息)
display();
CurrentConditionsDisplay<class>(Observer、DisplayElement的實(shí)現(xiàn)類,實(shí)現(xiàn)的這個(gè)布告板(觀察者)根據(jù)WeatherData對(duì)象顯示當(dāng)前的觀測(cè)值)
StatisticsDisplay<class>(Observer、DisplayElement的實(shí)現(xiàn)類,布告板(觀察者)根據(jù)WeatherData對(duì)象信息,跟蹤最小、平均、最大的觀測(cè)值,并顯示它們)
ForecastDisplay<class>(Observer、DisplayElement的實(shí)現(xiàn)類,布告板(觀察者)根據(jù)WeatherData對(duì)象信息,根據(jù)氣壓值來(lái)顯示天氣預(yù)報(bào))

其實(shí)我們能夠多少能夠看出來(lái),在觀察者模式中,會(huì)改變的是主題的狀態(tài),以及觀察者的數(shù)目和類型。用這個(gè)模式,可以在改變依賴這個(gè)主題狀態(tài)的觀察者對(duì)象,而不需要改變主題。并且主題和觀察者都是用接口來(lái)進(jìn)行設(shè)計(jì)規(guī)劃的,所以是具有松耦合的性質(zhì)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容