0
0

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(メディエータ)パターンは、
複数のオブジェクト間の複雑な相互依存関係を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パターンはその調和の知性を、設計の静けさとして体現する技法である。

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?