概要
Mediator(メディエーター)パターンは、
多くのオブジェクト間の直接的な相互参照を排除し、中央に仲介者を設けて通信や協調処理を管理する構造パターンである。
この設計により、クラス間の依存を低減し、柔軟かつ拡張性の高いシステム構築が可能となる。
1. なぜMediatorが必要か?
❌ オブジェクト同士が直接参照し合う密結合構造
class Button:
def click(self):
textbox.clear()
label.hide()
→ 関係が増えるごとに依存関係がスパゲッティ化していく
✅ 中央にMediatorを設置し、全てのやりとりを集約
button.click() # → mediator.notify(button, "click")
→ 構成要素はMediatorの存在だけを知り、他のオブジェクトを直接参照しない
2. 基本構造
✅ Mediator(共通インターフェース)
class Mediator:
def notify(self, sender, event):
raise NotImplementedError
✅ ConcreteMediator(具体的な仲介者)
class UIControlMediator(Mediator):
def __init__(self):
self.button = None
self.textbox = None
self.label = None
def notify(self, sender, event):
if sender == self.button and event == "click":
print("ボタンがクリックされました。")
self.textbox.clear()
self.label.hide()
✅ Components(各コンポーネント)
class Button:
def __init__(self, mediator):
self.mediator = mediator
def click(self):
self.mediator.notify(self, "click")
class TextBox:
def __init__(self, mediator):
self.mediator = mediator
def clear(self):
print("テキストボックスをクリアしました。")
class Label:
def __init__(self, mediator):
self.mediator = mediator
def hide(self):
print("ラベルを非表示にしました。")
✅ 使用例
mediator = UIControlMediator()
button = Button(mediator)
textbox = TextBox(mediator)
label = Label(mediator)
mediator.button = button
mediator.textbox = textbox
mediator.label = label
button.click()
出力:
ボタンがクリックされました。
テキストボックスをクリアしました。
ラベルを非表示にしました。
3. Python的応用:イベントベースアーキテクチャへの適用
class EventBus:
def __init__(self):
self._subscribers = {}
def subscribe(self, event, handler):
self._subscribers.setdefault(event, []).append(handler)
def publish(self, event, payload=None):
for handler in self._subscribers.get(event, []):
handler(payload)
→ Mediatorの拡張形として、疎結合なPub/Subモデルを表現可能
4. 実務ユースケース
✅ GUIコンポーネント間の連動動作制御
→ ボタン・入力欄・ラベルなどの状態変化を一元管理
✅ チャットルームの中継ロジック
→ 各ユーザーが中央のMediatorを介してメッセージを交換
✅ IoTデバイスの状態連携制御
→ 各センサー・デバイスの状態を中央のハブが制御・同期
✅ マイクロサービス間の連携処理
→ サービス間の調停者としてMediatorを配置し、サービス境界の明確化
5. よくある誤用と対策
❌ Mediatorにロジックが集中しすぎて巨大化
→ ✅ Mediatorは調停役に徹し、処理は各コンポーネントに委譲する
❌ コンポーネントが他のオブジェクトを知ってしまう
→ ✅ 各コンポーネントはMediator以外に依存しない設計とする
❌ イベントが不明確で通知が曖昧
→ ✅ イベント名・型を明示的に設計し、仕様を可視化する
結語
Mediatorパターンとは、“混線を調停し、秩序ある通信の中心を設計する技法”である。
- オブジェクト同士の密結合を避け、一元的な調停者に委ねることで構造を洗練
- 構成要素の独立性を保ちつつ、全体として統制されたふるまいを実現
- Pythonでは柔軟なクラス設計とイベント駆動型アーキテクチャとの相性も高く、明確な責務分離が可能
Pythonicとは、“絡み合う責任をひとつの中心に集約して解きほぐす”こと。
Mediatorパターンはその仲裁と統制を、構造として美しく表現する設計法である。