《Head First 設(shè)計模式》隨手筆記
觀察者模式的定義:在對象之間定義一對多的以來篓足,這樣一來未状,當一個對象改變狀態(tài),以來它的對象都會收到通知蜕径,并自動更新两踏。
舉個例子
氣象站要根據(jù)收集到的天氣信息進行分析,發(fā)布天氣情況到三個顯示不同信息的布告板兜喻,而且這個布告板必須實時更新梦染。
在設(shè)計的時候我們可以想,如果這個我想要一個不僅可以讓氣象臺發(fā)布情況的一個項目朴皆,我還想這個模版可以被廣播臺使用帕识,那我需要一個“主題”來使得我可以將這個模版應(yīng)用到不同的場景。
所以我可以做以下設(shè)計:
首先是設(shè)計主題
Subject<interface>(主題模版遂铡,用來對觀察者進行操作肮疗,像是增加刪除通知觀察者)
registerObserver();
removeObserver();
notifyObservers();
WeatherData<class>(Subject的實現(xiàn)類,用來實現(xiàn)主題扒接,像是氣象臺所需的天氣信息主題伪货,或者是廣播臺所需的節(jié)目信息等等)
registerObserver();
removeObserver();
notifyObservers();
然后是設(shè)計觀察者
Observer<interface>(觀察者模版们衙,用來接受主題的更新通知和吸收主題給到的信息,并對信息進行自定義處理)
update();
DisplayElement<interface>(觀察者模版超歌,用來顯示接受觀察者進行處理之后的信息)
display();
CurrentConditionsDisplay<class>(Observer砍艾、DisplayElement的實現(xiàn)類蒂教,實現(xiàn)的這個布告板(觀察者)根據(jù)WeatherData對象顯示當前的觀測值)
StatisticsDisplay<class>(Observer巍举、DisplayElement的實現(xiàn)類,布告板(觀察者)根據(jù)WeatherData對象信息凝垛,跟蹤最小懊悯、平均、最大的觀測值梦皮,并顯示它們)
ForecastDisplay<class>(Observer炭分、DisplayElement的實現(xiàn)類,布告板(觀察者)根據(jù)WeatherData對象信息剑肯,根據(jù)氣壓值來顯示天氣預(yù)報)
其實我們能夠多少能夠看出來捧毛,在觀察者模式中,會改變的是主題的狀態(tài)让网,以及觀察者的數(shù)目和類型呀忧。用這個模式,可以在改變依賴這個主題狀態(tài)的觀察者對象溃睹,而不需要改變主題而账。并且主題和觀察者都是用接口來進行設(shè)計規(guī)劃的,所以是具有松耦合的性質(zhì)因篇。