設計模式筆記 – 觀察者模式

分類

  • 行為型

模式的目的(定義)

  • n個觀察者對象把自身「注冊」到某個對象的通知列表中,當該對象狀態改變時,該對象遍歷這個列表,通知所有的觀察者對象
  • 觀察者對象收到通知後,便執行相應的行動,如:
    • 直接從觀察對象身上獲取數據
    • 根據從通知方法中傳來的參數做一些事情
    • 其他行為

使用場景例子

  • UI數據刷新是觀察者模式常用的場合之一,現在比如有一個動作遊戲,UI的Overlay面板上有各個控件用於顯示英雄的生命/攻撃力/…與遊戲場景中的英雄對象息息相關的信息:
    • UI控件在初始化時,將自己注冊到英雄對象的觀察者列表中
    • 英雄自身數據變化時,如被怪物A了一下,生命減少了10點,英雄就同時遍歷整個觀察者列表,通知所有觀察者自己的屬性已發生變化
      • 這裡既可以直接把變化值作為通知的參數傳給觀察者
      • 也可以只負責「通知」,具體取值由觀察者通過英雄對象提供的屬性getter獲取
    • 這裡一個優化點是增加「行為類型」
      • 觀察者注冊時,記錄觀察者關注的「行為類型」
        • Dictionary<EventType, List<IObserver> observers> eventObserversDict;
      • 然後屬性變化時,就可以只通知關注了某個「行為類型」的觀察者們
        • foreach observers in eventObserversDict[EventType.HealthUpdate]

類圖

參考書目

  • 《Head First Design Patterns》Eric Freeman, Elisabeth Robson, Kathy Sierra, Bert Bates