2 Observer Pattern(觀察者模式)
2.1設(shè)計(jì)原則一
為了交互對(duì)象的松耦合設(shè)計(jì)而努力
下面舉個(gè)例子說明這個(gè)原則。
1)案例分析一:
REQ1:Vander接到一個(gè)外包的項(xiàng)目,項(xiàng)目是關(guān)于下一代Internet的氣象觀測(cè)站,此系統(tǒng)中三個(gè)部分是氣象站(獲取實(shí)際氣象數(shù)據(jù)的物理裝置),WeatherData對(duì)象(追蹤來自氣象站的數(shù)據(jù),并更新布告板)和布告板(顯示目前天氣狀況給用戶看)。
Vander的工作就是建立一個(gè)應(yīng)用,利用WeatherData對(duì)象取得數(shù)據(jù),并更新是三個(gè)布告板:目前狀況、氣象統(tǒng)計(jì)、天氣預(yù)報(bào)。
委托方發(fā)送過來的WeatherData類:
所以Vander的工作就是完成measurementsChanged這個(gè)方法,好讓它更新目前狀況、氣象統(tǒng)計(jì)和天氣預(yù)報(bào)的顯示布告板。
解決方法1:Vander 就開始設(shè)計(jì)了
public void measurementsChanged() {
currentConditionDisplayer.update(temperature, humidity, pressure);
forecastDisplayer.update(temperature, humidity, pressure);
statisticDisplayer.update(temperature, humidity, pressure);
}
這個(gè)方法出現(xiàn)了以下4個(gè)問題:
1、針對(duì)實(shí)現(xiàn)編程而不是針對(duì)接口編程:首先更新數(shù)據(jù)的這個(gè)操作都是這三個(gè)布告板自己完成的,而不是由第三者來幫助完成(回想鴨子飛行的實(shí)現(xiàn)方法,鴨子飛行是由專門的飛行類來完成的,而不是由鴨子本身來實(shí)現(xiàn)的,鴨子本身只是調(diào)用了飛行類)。
2、對(duì)于每個(gè)新的布告板,都需要修改WeatherData這個(gè)類。
3、無法動(dòng)態(tài)添加或者刪除布告板:即每次增加刪除布告板都需要重新運(yùn)行程序
4、沒對(duì)變化的部分進(jìn)行封裝:WeatherData會(huì)因?yàn)椴几姘宓脑黾訙p少而改變,要針對(duì)這樣的改變進(jìn)行一定的封裝
解決方法2 觀察者模式:
Vander聽說了觀察者模式之后使用觀察者模式進(jìn)行設(shè)計(jì),先說明一下觀察者模式,實(shí)際上就是發(fā)布-訂閱模式,簡(jiǎn)單舉個(gè)例子,Vander和Pander和Triangle三個(gè)人一起訂了雜志,每天雜志社都會(huì)給他們推送雜志,有一天Triangle不想訂雜志了,跟雜志社取消訂閱,然后Triangle就不會(huì)收的雜志了,而Vander跟Panda繼續(xù)收到雜志,Triangle發(fā)現(xiàn)沒有雜志的日子太無聊了,所以又去訂閱雜志,于是他又能收到雜志了。實(shí)際上發(fā)布-訂閱模式,就是一種推數(shù)據(jù)的方式,由主題者(發(fā)布者)將數(shù)據(jù)推給觀察者(訂閱者)。
上圖中的做法實(shí)際上就是讓主題者在更新消息的同時(shí)然后幫觀察者調(diào)用觀察者的update方法。
解決方法3(使用Java api的觀察者):
注意Java Api的方式有一定的局限性,首先Observable是作為父類的,所以子類的WeatherData要成為主題者只能繼承Observable,Observable實(shí)現(xiàn)的notifyObservers方法中需要先調(diào)用setChanged方法,這樣子是為了保證不是每次更新數(shù)據(jù)都去通知布告板,但是Observable的setChanged方法是用protected保護(hù)起來了,這就意味著需要子類繼承Observable才能調(diào)用setChanged方法,這也就違反了第三條原則“多用組合,少用繼承”。
面向?qū)ο蠡A(chǔ)
抽象、封裝、多態(tài)、繼承
四大原則
設(shè)計(jì)原則一:封裝變化
設(shè)計(jì)原則二:針對(duì)接口編程,不針對(duì)實(shí)現(xiàn)編程。
設(shè)計(jì)原則三:多用組合,少用繼承。
設(shè)計(jì)原則四:為交互對(duì)象之間的松耦合設(shè)計(jì)而努力
模式
觀察者模式:在對(duì)象之間定義一對(duì)多的依賴,這樣一來,當(dāng)一個(gè)對(duì)象改變狀態(tài),依賴它的對(duì)象都會(huì)受到通知并自動(dòng)更新。