<一覧に戻る

メディエータパターン

メディエータパターンは、オブジェクト間の通信を仲介するオブジェクト(メディエータ)を導入し、オブジェクト同士の依存関係を減らすことを目的としています。このパターンは、複雑なオブジェクト間の相互作用を管理し、システムの柔軟性や保守性を向上させるのに役立ちます。

メディエータパターンの構成要素

メディエータパターンは、主に以下の3つの要素から構成されています。

  1. メディエータ(Mediator): オブジェクト間の通信を管理するインターフェース。
  2. 具体的メディエータ(Concrete Mediator): メディエータインターフェースを実装し、特定のオブジェクト間の相互作用を管理するクラス。
  3. 仲介対象(Colleague): メディエータを介して通信するオブジェクト。これらのオブジェクトは、メディエータを介してのみ相互作用します。

サンプルコード

以下に、メディエータパターンを使用した簡単なチャットアプリケーションの例を示します。この例では、ユーザー同士がメディエータを介してメッセージをやり取りします。

1. メディエータインターフェースの定義

class Mediator:
    def send(self, message: str, colleague: 'Colleague'):
        raise NotImplementedError

2. 仲介対象(Colleague)の基本クラス

class Colleague:
    def __init__(self, mediator: Mediator):
        self.mediator = mediator

    def send(self, message: str):
        self.mediator.send(message, self)

    def receive(self, message: str):
        print(f"{self.__class__.__name__} received: {message}")

3. 具体的メディエータの実装

class ChatMediator(Mediator):
    def __init__(self):
        self.colleagues = []

    def register(self, colleague: Colleague):
        self.colleagues.append(colleague)

    def send(self, message: str, colleague: Colleague):
        for c in self.colleagues:
            if c != colleague:
                c.receive(message)

4. 具体的仲介対象の実装

class User(Colleague):
    def __init__(self, mediator: Mediator, name: str):
        super().__init__(mediator)
        self.name = name
        self.mediator.register(self)

    def send(self, message: str):
        print(f"{self.name} sends: {message}")
        super().send(message)

    def receive(self, message: str):
        print(f"{self.name} received: {message}")

5. メインプログラム

if __name__ == "__main__":
    mediator = ChatMediator()

    user1 = User(mediator, "Alice")
    user2 = User(mediator, "Bob")
    user3 = User(mediator, "Charlie")

    user1.send("Hello, everyone!")
    user2.send("Hi Alice!")
    user3.send("Good morning!")

サンプルコードの解説

  1. メディエータインターフェース: Mediatorクラスは、送信メソッドを定義します。具体的なメディエータはこのインターフェースを実装し、送信のロジックを提供します。

  2. 仲介対象の基本クラス: Colleagueクラスは、メディエータを持ち、メッセージを送信・受信するメソッドを実装します。仲介対象は、他の仲介対象と直接通信するのではなく、メディエータを介して通信します。

  3. 具体的メディエータ: ChatMediatorクラスは、仲介対象を管理し、メッセージを適切な仲介対象に送信する役割を果たします。仲介対象が新しく追加されると、registerメソッドでリストに追加されます。

  4. 具体的仲介対象: Userクラスは、ユーザーを表す具体的な仲介対象です。ユーザーは名前を持ち、メッセージを送信するとメディエータを介して他のユーザーにメッセージが配信されます。

  5. メインプログラム: 最後に、メインプログラムでメディエータとユーザーを作成し、メッセージを送信しています。ユーザーがメッセージを送信すると、他のユーザーにそのメッセージが届くことが確認できます。

まとめ

メディエータパターンは、オブジェクト間の通信を簡素化し、依存関係を減らすための強力な手法です。このパターンを使用することで、システムの保守性や拡張性が向上します。今回の例を通じて、メディエータパターンの概念を理解し、実装方法を学ぶことができたと思います。

出力結果: