天天看點

Head First 設計模式 —— 02. 觀察者 (Observer) 模式

思考題

在我們的一個實作中,下列哪種說法正确?(多選)

P42

public class WeatherDate {
    // 執行個體變量聲明

    public void measurementsChanged() {
        float temp = getTemperature();
        float humidity = getHumidity();
        float pressure = getPressure();

        currentConditionsDisplay.update(temp, humidity, pressure);
        statisticsDisplay.update(temp, humidity, pressure);
        forecastDisplay.update(temp, humidity, pressure);
    }

    // 其他 WeatherData 方法
}           
  • [x] A. 我們是針對具體實作程式設計,而非針對接口
    • 每個布告闆都是直接進行更新
  • [x] B. 對于每個新的布告闆,我們都得修改代碼
    • 每個新的布告闆,都需加一行更新代碼
  • [x] C. 我們無法在運作時動态地增加(或删除)布告闆
    • 沒有針對接口程式設計,運作時無法更改布告闆
  • [x] D. 布告闆沒有實作一個共同的接口
    • 沒有布告闆的相關介紹,認為沒有實作同一個接口
    • 後來又學到

      TypeScript

      Golang

      等語言,這些語言是存在鴨子類型,不需要顯示繼承類或者接口(但本書所有例子都是

      Java

      ,是以不認為是鴨子類型)
    • 【答案認為沒有此選項】所有布告闆都有相同的更新方式,看起來像實作了一個共同的接口
  • [x] E. 我們尚未封裝改變的部分
    • 布告闆會動态更新,此處仍是針對實作程式設計
  • [x] F. 我們侵犯了 WeatherData 類的封裝
    • 修改了不屬于我們負責的類
    • 【答案認為沒有此選項】方法沒有入參,暗示必須在方法内修改

觀察者模式

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

P51

Head First 設計模式 —— 02. 觀察者 (Observer) 模式
  • 設計原則:為了互動對象之間的松耦合設計而努力

    P53

    • 松耦合把對象之間的互相依賴降到了最低,是以可以增加彈性,應對變化

所思所想

  • 覺得觀察者模式又像用到了政策,不同的觀察者和不同的主題就類似于不同的政策;可能各個不同的設計模式都運用到 OO基礎和OO原則,使得有點相似,但是解決的問題還是有所差異的
  • 觀察者模式也用得很多,以前用的各種事件監聽器就是觀察者模式,不過這種模式的觀察者不需要主題的引用,注冊由用戶端實作
    本文首發于公衆号:滿賦諸機( 點選檢視原文 ) 開源在 GitHub : reading-notes/head-first-design-patterns
    Head First 設計模式 —— 02. 觀察者 (Observer) 模式