概要
Mediator(メディエータ)パターンは、
複数のオブジェクト間の複雑な相互依存関係を1つの“調停者(Mediator)”に集約することで、構造を疎結合化する設計パターンである。
各オブジェクト(コンポーネント)はMediatorを介して通信することで、直接的な依存を排除し、拡張性と再利用性を高めることができる。
1. なぜMediatorが必要か?
❌ オブジェクト同士が直接やり取りをすると、依存が網の目状に複雑化する
class Button:
def click(self):
textbox.clear()
logger.log()
→ 各オブジェクトが他の内部構造を知ってしまい、結合度が高くなる
✅ Mediatorを通じてオブジェクト同士のやり取りを仲介する
class Button:
def click(self):
self.mediator.notify(self, "click")
→ Mediatorが全体の調整役を担い、オブジェクトは自己に集中できる
2. 基本構造
✅ Mediatorインターフェース
class Mediator:
def notify(self, sender, event: str):
raise NotImplementedError
✅ ConcreteMediator(調停者)
class UIControlMediator(Mediator):
def __init__(self):
self.button = None
self.textbox = None
def notify(self, sender, event):
if sender == self.button and event == "click":
print("ボタンがクリックされました。テキストボックスをクリアします。")
self.textbox.clear()
✅ コンポーネント(参加者)
class Button:
def __init__(self, mediator: Mediator):
self.mediator = mediator
def click(self):
self.mediator.notify(self, "click")
class TextBox:
def __init__(self, mediator: Mediator):
self.mediator = mediator
self.content = "入力中..."
def clear(self):
print("テキストボックスをクリア")
self.content = ""
✅ 使用例
mediator = UIControlMediator()
button = Button(mediator)
textbox = TextBox(mediator)
mediator.button = button
mediator.textbox = textbox
button.click()
出力:
ボタンがクリックされました。テキストボックスをクリアします。
テキストボックスをクリア
3. Python的応用:Pub/Subライクなメッセージルーターとしての活用
class EventMediator:
def __init__(self):
self._subscribers = {}
def subscribe(self, event, handler):
self._subscribers.setdefault(event, []).append(handler)
def notify(self, event, *args, **kwargs):
for handler in self._subscribers.get(event, []):
handler(*args, **kwargs)
# 使用例
mediator = EventMediator()
mediator.subscribe("login", lambda user: print(f"{user} がログインしました"))
mediator.notify("login", "Alice")
→ イベントハブとしての汎用的Mediatorも実装可能
4. 実務ユースケース
✅ UIコンポーネント間の相互作用(フォーム、モーダル、ボタン)
→ 特定の操作に応じた複数UIの状態変化を制御
✅ ゲームエンジン内のエンティティ調整
→ キャラクター・環境・UIがMediatorを通じて相互作用
✅ メッセージング・イベント伝達ハブ
→ モジュール間の通信路を集中管理
✅ チャットシステムのルーム内中継者
→ 各ユーザーはMediatorを介して発言を中継
5. よくある誤用と対策
❌ Mediatorが巨大なif文の塊になって複雑化する
→ ✅ 処理ごとにメソッド分割し、構造的に整理する
❌ Mediatorが単なるデータ通過点になってしまう
→ ✅ Mediatorは「調停者」として振る舞いの調整を担う設計にする
❌ 依存関係が完全に逆転してMediatorに全ロジックを押し付けてしまう
→ ✅ 各コンポーネントは自身の責務を持ちつつ、Mediatorに通知する構成にとどめる
結語
Mediatorパターンとは、“相互依存の渦を調停し、オブジェクトを独立させる設計”である。
- 複数オブジェクトのやり取りを1つのMediatorに集約し、依存を制御・構造を明確化
- 新たなコンポーネント追加も容易で、再利用性・拡張性に優れる
- Pythonではクラスベース・イベントベースどちらでも表現可能で、動的な連携が構築できる
Pythonicとは、“やり取りを仲介者に委ね、各自は自身の責務に集中すること”。
Mediatorパターンはその調和の知性を、設計の静けさとして体現する技法である。