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が必要か?

❌ オブジェクト同士が直接参照し合う密結合構造

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パターンはその仲裁と統制を、構造として美しく表現する設計法である。

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?