用來說明觀察者模式最常見也最容易懂的例子就是報社訂閱報紙: 報社的主要工作就是出版報紙 (提供資料) 用戶可向報社訂閱報紙。只要報社有出版新報紙, 而你在報社的訂閱名單中, 你都可以收到最新的報紙。 當你不想再看報紙時, 可隨時取消訂閱, 報社就不會送報紙到你家。 只要報社還存在, 用戶就可隨時向報社訂閱或取消訂閱報紙。 假如你看得懂上面的例子的話, 其實也大概了解觀察者模式在幹什麼。把上面的例子, 報社改名為主題 (Subject), 訂閱者改為觀察者 (Observer), 觀察者模式 = 出版者 + 訂閱者 。 更精確的觀察者模式定義為: 觀察者模式定義了物件之間的一對多關係, 如此一來, 當一個物件改變狀態, 其他相依者都會收到通知並自動被更新 。 Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 以下來看個簡單的觀察者模式類別圖: 主題介面定義了 registerObserver(), removeObserver(), 可以讓物件變成觀察者, 或從觀察者名單中移除, 而觀察者介面定義了 update(), 當主題有改變時, 可以用來通知所有觀察者。在此介紹觀察者模式的設計守則: 設計時, 盡量讓需要互動的物件之間關係鬆綁 。此設計讓我們建立有彈性的 OO 系統, 能夠因應變化, 因為物件的相依性被降到最低。 關於觀察者的一切, 主題只知道觀察者有實作特定介面 (也就是 Observer 介面) 。主題不需要知道觀察者的具體類別為何、做了什麼、及其細節。 任何時候都可以加入新的觀察者 。 有新型態的觀察者出現時, 主題的程式碼不用修改 。主題不在乎觀察者實際類別, 只在乎有沒有實作觀察者介面。 片面改...
深入淺出設計模式 (Head First Design Patterns) 的筆記