概要
Mediator(メディエーター)パターンは、
複数のオブジェクト間で発生する相互通信・連携を、中心に存在する調停者(Mediator)によって統括・制御するデザインパターンである。
直接的な依存関係を避け、オブジェクト間の結びつきを疎結合に保つことができる。
1. なぜMediatorが必要か?
❌ オブジェクト同士が直接参照し合い、依存性が爆発する
button.on_click = form.validate
form.on_success = modal.show
modal.on_close = button.reset
→ UIやロジックがスパゲッティ状態になり、保守不能
✅ 中央のMediatorが各コンポーネントを仲介する構造へ
button.on_click = lambda: mediator.notify("button_clicked")
→ 全体の調整をMediatorに一任し、各要素は役割に集中できる
2. 基本構造
✅ Mediatorインターフェース
class Mediator:
def notify(self, sender, event):
raise NotImplementedError
✅ Concrete Mediator(調停者)
class UIControlMediator(Mediator):
def __init__(self, button, form, modal):
self.button = button
self.form = form
self.modal = modal
button.mediator = self
form.mediator = self
modal.mediator = self
def notify(self, sender, event):
if sender == self.button and event == "click":
self.form.validate()
elif sender == self.form and event == "valid":
self.modal.show()
elif sender == self.modal and event == "close":
self.button.reset()
✅ 各コンポーネント
class Button:
def __init__(self):
self.mediator = None
def click(self):
print("Button: clicked")
self.mediator.notify(self, "click")
def reset(self):
print("Button: reset")
class Form:
def __init__(self):
self.mediator = None
def validate(self):
print("Form: validated")
self.mediator.notify(self, "valid")
class Modal:
def __init__(self):
self.mediator = None
def show(self):
print("Modal: shown")
self.mediator.notify(self, "close")
✅ 使用例
button = Button()
form = Form()
modal = Modal()
mediator = UIControlMediator(button, form, modal)
button.click()
出力:
Button: clicked
Form: validated
Modal: shown
Button: reset
3. Python的応用:文字列ベースの動的通知システム
class EventMediator:
def __init__(self):
self._handlers = {}
def register(self, event_name, handler):
self._handlers.setdefault(event_name, []).append(handler)
def notify(self, event_name, *args, **kwargs):
for handler in self._handlers.get(event_name, []):
handler(*args, **kwargs)
mediator = EventMediator()
mediator.register("on_save", lambda: print("保存処理"))
mediator.register("on_save", lambda: print("ログ記録"))
mediator.notify("on_save")
→ シグナル/スロット的設計もMediatorの応用形
4. 実務ユースケース
✅ UIコンポーネントの相互連携(フォーム、モーダル、ボタン)
→ ビュー層の複雑な依存関係を仲介構造で整理
✅ ドメインイベントによる非同期通知システム
→ 状態変更をトリガーに複数の関係者へイベント配信
✅ ゲームやロボティクスにおける状態制御の集中管理
→ 複数のキャラクター/エージェントを中央調停者が制御
✅ チャットシステムのルーム構造・メッセージ配信
→ 各クライアントのメッセージ送信をMediatorが配信制御
5. よくある誤用と対策
❌ Mediatorが全知全能化しすぎる
→ ✅ Mediatorも責務を分割し、必要なら複数用意する
❌ 通知と処理が密結合になってしまう
→ ✅ 通知は抽象化し、処理ロジックは委譲やコマンドで設計
❌ コンポーネントがMediatorを意識しすぎる
→ ✅ インターフェース/抽象Mediatorを経由して依存を最小限に
結語
Mediatorパターンとは、“多方向の関係性を一つの中枢へと集約し、構造を秩序立てる設計”である。
- オブジェクト間の依存を調停者に任せることで、疎結合かつ柔軟な構造を構築
- 複雑な連携関係を明示的に構造で表現し、全体を見通しやすくする
- Pythonではインターフェース不要でも簡潔に設計可能で、UI・通知・イベント処理に応用しやすい
Pythonicとは、“構造の中心に調停の知性を置くこと”。
Mediatorパターンはその知性の集約を、設計の中に静かに宿す技法である。