站長留言

  • ✅ 本站維護及更新歷史紀錄,詳情請參考公告
  • ✅ 有任何意見、想法,歡迎留言給Spicy知道喔
  • ✅ 固定於每周一至周五更新Blogger文章,周末不定期
程式Design PatternJava

【Design Pattern】2:Observer Pattern 觀察者模式、監聽者模式 (行為)

上一篇:Introduction 簡介 & Strategy Pattern 策略模式 (行為)

Introduction 簡介

  1. 又稱為 Publish-Subscribe Pattern (發布-訂閱)、監聽者模式
  2. 定義物件之間一對多的關係
  3. all its dependents are notified and updated automatically
    所有它(Subject)的依賴者(Observers) 都會自動被通知並更新
  4. OO:將系統切割成一群互相協同合作的物件,以便提高個別物件的 reusable 可重用性
    • 錯誤的寫法,例如:針對implementation寫程式,會導致增加、刪除的麻煩
    • 正確的寫法:經常變動的地方 → 封裝
    • programming to an interface, not an implementation

Observer Pattern

  1. Subject + Observer
    • Subject:管理資料,資料改變時通知Observer
    • Observer:收到通知
  2. 確保 observerState 與 subjectState 保持一致
  3. 設計守則:讓需要互動的物件之間關係鬆綁, loose-coupling
    • loose-coupling 解耦:不用假設是誰
  4. push & pull models
    • Push Model:Subject 或多或少知道觀察者 Observer 的個別需求
    • Pull Model:Subject 只送出 最少量 的資訊,不夠的話 Observer 再自行去向 Subject『索取』
    • 兩者各有優缺點,但是大部分都是使用 Push Model
  5. Java內建的Observer,有缺點
    • Observable 是一個 class,只能用繼承的方式
    • 違反favor object composition over class inheritance
    • 因此,程式設計師通常會自己設計 Observer 的 interface,而不使用 Java 的
  6. Observer Pattern的缺點
    • 一對太多,會需要耗費很多時間通知 Observer
    • Observer 和 Subject 可能存在循環依賴 (circular dependency)
      • 很少出現,基本上程式設計師不會犯這種錯誤
      • solution:單向

Example 範例

  1. Android:BroadcastReceiver

  2. 獵頭 (Subject)和找工作的人們(Observers)

Code 程式碼範例

延伸閱讀:Lambda表示式

  1. 在找觀察者模式的範例幫助理解時,經常看到很像箭頭的特殊寫法
  2. 延伸閱讀
Arrays.sort(applicants, (ja1, ja2) -> vacancy.bySeniority(ja1, ja2));

Reference 參考資料

  1. 圖片:https://codeburst.io/observer-pattern-object-oriented-php-4e669431bcb9
  2. 觀察者模式 (Observer Pattern):
    https://notfalse.net/10/observer-pattern#ConcreteObserver-ex
  3. 重新整理Observer Pattern:
    http://teddy-chen-tw.blogspot.com/2013/08/observer-pattern.html
  4. 範例圖片:
    https://www.programcreek.com/2011/01/an-java-example-of-observer-pattern/
  5. The Observer Pattern in Java:https://dzone.com/articles/observer-pattern-java
  6. Lambda表示式:https://openhome.cc/Gossip/Java/MethodConstructorReference.html
下一篇:Decorator Pattern 裝飾者模式、修飾模式 (結構)

沒有留言:

張貼留言

本網站建議使用電腦或平板瀏覽