0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

概要

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?