メディエータパターンは、オブジェクト間の通信を仲介するオブジェクト(メディエータ)を導入し、オブジェクト同士の依存関係を減らすことを目的としています。このパターンは、複雑なオブジェクト間の相互作用を管理し、システムの柔軟性や保守性を向上させるのに役立ちます。
メディエータパターンは、主に以下の3つの要素から構成されています。
以下に、メディエータパターンを使用した簡単なチャットアプリケーションの例を示します。この例では、ユーザー同士がメディエータを介してメッセージをやり取りします。
class Mediator:
def send(self, message: str, colleague: 'Colleague'):
raise NotImplementedError
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}")
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)
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}")
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!")
メディエータインターフェース: Mediator
クラスは、送信メソッドを定義します。具体的なメディエータはこのインターフェースを実装し、送信のロジックを提供します。
仲介対象の基本クラス: Colleague
クラスは、メディエータを持ち、メッセージを送信・受信するメソッドを実装します。仲介対象は、他の仲介対象と直接通信するのではなく、メディエータを介して通信します。
具体的メディエータ: ChatMediator
クラスは、仲介対象を管理し、メッセージを適切な仲介対象に送信する役割を果たします。仲介対象が新しく追加されると、register
メソッドでリストに追加されます。
具体的仲介対象: User
クラスは、ユーザーを表す具体的な仲介対象です。ユーザーは名前を持ち、メッセージを送信するとメディエータを介して他のユーザーにメッセージが配信されます。
メインプログラム: 最後に、メインプログラムでメディエータとユーザーを作成し、メッセージを送信しています。ユーザーがメッセージを送信すると、他のユーザーにそのメッセージが届くことが確認できます。
メディエータパターンは、オブジェクト間の通信を簡素化し、依存関係を減らすための強力な手法です。このパターンを使用することで、システムの保守性や拡張性が向上します。今回の例を通じて、メディエータパターンの概念を理解し、実装方法を学ぶことができたと思います。