再看設計模式——觀察者模式,設計模式觀察者模式
隨著軟考的進行,開始了新一輪設計模式的學習,距離上一次這種整體、從頭到尾學習設計模式已經有一段時間了。上次整體上的學習中,主要是瞭解,簡單的使用設計模式。隨著這一段時間的接觸,潛移默化,這次的學習,相對深入一些。下面我以觀察者模式為例,記錄一下這次設計模式的學習。(以Head First 設計模式為主要材料)。
1、複習什麼是觀察者模式
我們看看報紙和雜誌的訂閱是怎麼回事:報社的業務就是出版報紙向某家報社訂閱報紙,只要他們有新報紙出版,就會給你送來。只要你是他們的訂戶,你就會一直收到新報紙當你不想再看報紙的時候,取消訂閱,他們就不會再送新報紙來只要報社還在運營,就會一直有人(或單位)向他們訂閱報紙或取消訂閱報紙。如果你瞭解報紙的訂閱是怎麼回事,其實就知道觀察者模式是怎麼回事,只是名稱不太一樣:出版者改稱為“主題”(Subject),訂閱者改稱為“觀察者”(Observer)。觀察者模式,關係:
2、觀察者模式定義
當你試圖勾勒觀察者模式時,可以利用報紙訂閱服務,以及出版者和訂閱者比擬這一切在真實的世界中,你通常會看到觀察者模式被定義成:
a.觀察者模式定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新
b.觀察者模式定義了一系列對象之間的一對多關聯性
c.當一個對象改變狀態,其他依賴者都會收到通知
3、觀察者 模式類圖
當兩個對象之間松耦合,它們依然可以互動,但是不太清楚彼此的細節觀察者模式提供了一種對象設計,讓主題和觀察者之間松耦合為什嗎?
關於觀察者的一切,主題只知道觀察者實現了某個介面(也就是Observer介面)。主題不需要知道觀察者的具體類是誰、做了些什麼或其他任何細節。
任何時候我們都可以增加新的觀察者
因為主題唯一依賴的東西是一個實現Observer介面的對象列表,所以我們可以隨時增加觀察者事實上,在運行時我們可以用新的觀察者取代現有的觀察者,主題不會受到任何影響。同樣的,也可以在任何時候刪除某些觀察者。
我們可以獨立地複用主題或觀察者
如果我們在其他地方需要使用主題或觀察者,可以輕易地複用,因為二者並非緊耦合。
改變主題或觀察者其中一方,並不會影響另一方
因為兩者是松耦合的,所以只要他們之間的介面仍被遵守,我們就可以自由地改變他們。
4.程式碼範例
以氣象站的例子為例(例子來自head first 設計模式)
類圖如下:
氣象站主題代碼如下
在WeatherData中實現主題介面
建立布告板代碼
都建立成功之後,可以建立如下測試才程式
可以得到如下結果
總結
到目前為止,這個設計模式的學習基本上是完善了。在一次學習,也是一次補充和加深的過程,有很多以前無法理解,不好理解或者不懂的問題,在這次學習中,基本上都解決了。一次次的學習和複習,一定會有很好的效果。畢竟,學習就是反覆的過程。