觀察者 (Observer)

★★★★★Studied

FromDesign Patterns (GoF)大話設計模式Design Patterns Explained

📚 From the Books

觀察者 (Observer)ConceptBehavioral

定義一對多的依賴:一個 subject 狀態改變時,自動通知並更新所有註冊的 observer。核心是讓「被觀察方」不必知道觀察它的是誰、有幾個,只負責廣播事件。

🧠 When to Use

TIP

訊號:一份資料變動時,有「一群」對象要連動更新(UI 重繪、快取失效、發通知),而且這群對象的數量與身分會隨執行期增減。

⚖️ Structure & Variants

經典版 — Subject 維護清單,狀態變就 notify
fun interface Observer { fun update(temp: Int) }

class WeatherStation {
    private val observers = mutableListOf<Observer>()
    fun subscribe(o: Observer) { observers += o }
    fun unsubscribe(o: Observer) { observers -= o }

    var temperature: Int = 0
        set(value) {
            field = value
            observers.forEach { it.update(value) }   // ← 廣播
        }
}

val station = WeatherStation()
station.subscribe { temp -> println("Display: $temp°C") }
station.temperature = 26    // Display: 26°C
  • WeatherStation 不知道有幾個顯示器;退訂只是把物件移出清單。
Push vs Pull — 通知時帶多少資料
  • Pushupdate(value) 直接把變動內容塞給 observer,簡單但耦合到參數形狀。
  • Pull:只發「我變了」的訊號,observer 再回頭呼叫 subject 的 getter 拿需要的部分,較鬆耦合但多一次往返。
和 Pub/Sub、Reactive Stream 的關係
  • Pub/Sub 通常多一層 event channel/broker,發布者與訂閱者彼此完全不知道對方,比 Observer 更解耦。
  • FP 的 reactive stream(RxJava、Flow)可視為 Observer 的進化:把「事件序列」變成可組合的一等公民,內建 map/filter/背壓。

⚠️ Misuse & Anti-patterns

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading