天天看點

2.觀察者模式(Observer Pattern)

在觀察者模式一章中,Head Fist一書主要是通過“氣象台”的例子,來講解優化代碼,并将觀察者模式自然而然的融入進去。

本例粗略介紹:有一個屌絲網際網路公司赢得了一家氣象台的合約,氣象台要求如下:氣象台給提供WeatherData源檔案,網際網路公司可以根據源檔案擷取裡面的氣象資料,然後根據這些資料去公布一組API,可以讓其他的開發人員根據這組API去寫出自己的氣象布告闆。

本例主要要解決的問題:每個布告闆所需參數數量、種類可能不一樣,布告闆資料需要根據WeatherData中的資料進行實時變化,布告闆的新增應對原有代碼影響到最小。

本章中出現的設計原則:為了互動對象之間的松耦合設計而努力。

注解:松耦合的設計之是以能讓我們建立有彈性的OO系統,能夠應對變化,是因為對象之間的互相依賴降到了最低。

觀察者模式的定義:定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀态時,它的所有依賴者都會收到通知并自動更新。

觀察者模式的适用條件:一個對象狀态的改變對其他多個對象有影響。

觀察者模式的兩種實作方式:

一:自己建立可觀察者與觀察者的接口及實作類。(推薦采用此方式)

1.定義可觀察者接口,接口中包括注冊、删除、通知觀察者方法。根據需求實作該接口,并設定一個狀态改變标記,隻有當狀态改變時才能調用通知方法。在其中需設定一個全局的接收觀察者對象的數組或list,以供注冊、删除方法使用,還有在通知觀察者時,先對數組進行周遊,再調用具體觀察者裡面的update方法使得觀察者得到資料後做出相應的操作。如有需要還需建立擷取資料setter方法或者getter方法,以便可觀察者推送資料給觀察者或觀察者從可觀察者中拉取資料。若設setter方法則需在setter資料後調用其中的通知方法,因為setter模拟的是資料的改變,資料改變後需要對觀察者進行通知操作。

2.定義觀察者接口,在其中定義update方法。根據需求實作該接口,并在實作類的構造器中将目前實作類注冊到可觀察者對象中。然後對update具體的方法進行實作。在update中接收可觀察者傳來的資料,并按需求對資料進行操作。

3.在具體測試或者使用時,先初始化具體的觀察者,将其注冊到可觀察者中,然後調用可觀察者的資料更新的方法(在此例中是setter方法模拟資料的改變)即可。

二:可觀察者:繼承:java.util.Observable類。觀察者:實作:java.util.Observer接口。

接下來的操作基本上和一方法相似。

注意事項:在實作時應時刻受到設計原則:面向接口程式設計的限制,勿随意建立新對象,采用具體對象裡的方法,應采用接口中的方法通過多态去調用具體的實作方法。