Pythonで実装するMediatorパターン：複雑な相互依存をハブ構造で整理する



## 概要

**Mediator（メディエーター）パターン**は、  
複数のオブジェクト間で発生する**相互通信・連携を、中心に存在する調停者（Mediator）によって統括・制御する**デザインパターンである。

直接的な依存関係を避け、**オブジェクト間の結びつきを疎結合に保つことができる**。

---

## 1. なぜMediatorが必要か？

### ❌ オブジェクト同士が直接参照し合い、依存性が爆発する

```python
button.on_click = form.validate
form.on_success = modal.show
modal.on_close = button.reset
```

→ UIやロジックが**スパゲッティ状態になり、保守不能**

---

### ✅ 中央のMediatorが各コンポーネントを仲介する構造へ

```python
button.on_click = lambda: mediator.notify("button_clicked")
```

→ **全体の調整をMediatorに一任し、各要素は役割に集中できる**

---

## 2. 基本構造

### ✅ Mediatorインターフェース

```python
class Mediator:
    def notify(self, sender, event):
        raise NotImplementedError
```

---

### ✅ Concrete Mediator（調停者）

```python
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()
```

---

### ✅ 各コンポーネント

```python
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")
```

---

### ✅ 使用例

```python
button = Button()
form = Form()
modal = Modal()

mediator = UIControlMediator(button, form, modal)
button.click()
```

出力:
```
Button: clicked  
Form: validated  
Modal: shown  
Button: reset
```

---

## 3. Python的応用：文字列ベースの動的通知システム

```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)
```

```python
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パターンはその知性の集約を、設計の中に静かに宿す技法である。**