中介者 (Mediator)

★★★★★Studied

FromDesign Patterns (GoF)大話設計模式

📚 From the Books

中介者 (Mediator)ConceptBehavioral

用一個中介者集中管理一群物件之間的多對多互動,讓每個同儕只跟中介者說話,而不直接互相引用。網狀耦合因此被收斂成星狀。

🧠 When to Use

TIP

訊號:一堆物件彼此互相引用、誰改了就要通知一票對象,耦合圖糊成一團蜘蛛網,你開始數不清「誰會影響誰」。

⚖️ Structure & Variants

經典版 — 同儕只認得中介者
interface Mediator { fun notify(sender: String, event: String) }

class Dialog : Mediator {
    val ok = Button(this); val agree = CheckBox(this)
    override fun notify(sender: String, event: String) {
        if (sender == "agree")               // ← 協調邏輯集中在此
            ok.enabled = (event == "checked")
    }
}

class Button(private val m: Mediator) { var enabled = false }
class CheckBox(private val m: Mediator) {
    fun toggle(checked: Boolean) = m.notify("agree", if (checked) "checked" else "")
}
  • ButtonCheckBox 互不認識,連動規則只住在 Dialog 裡。
和 Observer 的關係
  • 兩者都在「減少物件間直接引用」;常用 Observer 機制來實作 Mediator(同儕對中介者發事件)。
  • 差別:Observer 是單向廣播、發送者不在乎誰收;Mediator 額外集中決策這些訊號之間該怎麼連動。
和 Facade 的差別(最容易混)
  • Facade:對一組子系統提供單向、簡化的入口;子系統不會回頭呼叫 facade。
  • Mediator:在同儕之間雙向協調;同儕會主動通知中介者、中介者也會回頭驅動同儕。

⚠️ Misuse & Anti-patterns

🔑 Takeaways

✍️ My Notes

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

📖 Further Reading