Introduction 簡介
- 又稱為 Publish-Subscribe Pattern (發布-訂閱)、監聽者模式
- 定義物件之間一對多的關係
- all its dependents are notified and updated automatically
所有它(Subject)的依賴者(Observers) 都會自動被通知並更新 - OO:將系統切割成一群互相協同合作的物件,以便提高個別物件的 reusable 可重用性
- 錯誤的寫法,例如:針對implementation寫程式,會導致增加、刪除的麻煩
- 正確的寫法:經常變動的地方 → 封裝
- programming to an interface, not an implementation
Observer Pattern
- Subject + Observer
- Subject:管理資料,資料改變時通知Observer
- Observer:收到通知
- 確保 observerState 與 subjectState 保持一致
- 設計守則:讓需要互動的物件之間關係鬆綁, loose-coupling
- loose-coupling 解耦:不用假設是誰
- push & pull models
- Push Model:Subject 或多或少知道觀察者 Observer 的個別需求
- Pull Model:Subject 只送出 最少量 的資訊,不夠的話 Observer 再自行去向 Subject『索取』
- 兩者各有優缺點,但是大部分都是使用 Push Model
- Java內建的Observer,有缺點
- Observable 是一個 class,只能用繼承的方式
- 違反favor object composition over class inheritance
- 因此,程式設計師通常會自己設計 Observer 的 interface,而不使用 Java 的
- Observer Pattern的缺點
- 一對太多,會需要耗費很多時間通知 Observer
- Observer 和 Subject 可能存在循環依賴 (circular dependency)
- 很少出現,基本上程式設計師不會犯這種錯誤
- solution:單向
Example 範例
-
Android:BroadcastReceiver
-
獵頭 (Subject)和找工作的人們(Observers)
Code 程式碼範例
- Link:https://github.com/SpicyBoyd/Design-Pattern-Example/tree/master/observer
- 可以有很多個 Observer,請自行增加
延伸閱讀:Lambda表示式
- 在找觀察者模式的範例幫助理解時,經常看到很像箭頭的特殊寫法
- 延伸閱讀
Arrays.sort(applicants, (ja1, ja2) -> vacancy.bySeniority(ja1, ja2));
Reference 參考資料
- 圖片:https://codeburst.io/observer-pattern-object-oriented-php-4e669431bcb9
- 觀察者模式 (Observer Pattern):
https://notfalse.net/10/observer-pattern#ConcreteObserver-ex - 重新整理Observer Pattern:
http://teddy-chen-tw.blogspot.com/2013/08/observer-pattern.html - 範例圖片:
https://www.programcreek.com/2011/01/an-java-example-of-observer-pattern/ - The Observer Pattern in Java:https://dzone.com/articles/observer-pattern-java
- Lambda表示式:https://openhome.cc/Gossip/Java/MethodConstructorReference.html
沒有留言:
張貼留言