🦊

Mediator

2023/09/10に公開

Mediator パターンは、オブジェクト間の通信をカプセル化するオブジェクトを定義するデザインパターンです。このパターンは、オブジェクトが直接通信するのではなく、Mediatorオブジェクトを介して通信することで、オブジェクト間の依存関係を減少させ、疎結合を促進します。

主要な構成要素:

  1. Mediator (仲介者): すべての通信をコーディネートするインターフェースや抽象クラス。
  2. ConcreteMediator (具体的な仲介者): Mediatorの具体的な実装で、Colleagueオブジェクト間の通信を調整します。
  3. Colleague (同僚): 通信を行うオブジェクトのインターフェースや基本クラス。
  4. ConcreteColleague (具体的な同僚): Colleagueの具体的な実装で、Mediatorを通して他のColleagueと通信します。

例:

複数の部屋の照明を制御するシステムを考えてみましょう。

  1. Mediator:

    from abc import ABC, abstractmethod
    
    class Mediator(ABC):
        @abstractmethod
        def notify(self, sender, event):
            pass
    
    
  2. ConcreteMediator:

    class LightMediator(Mediator):
        def __init__(self):
            self.rooms = {}
    
        def add_room(self, room):
            self.rooms[room.name] = room
    
        def notify(self, sender, event):
            if event == "ON":
                for room_name, room in self.rooms.items():
                    if room_name != sender.name:
                        room.turn_off()
    
    
  3. Colleague:

    class Room:
        def __init__(self, name, mediator):
            self.name = name
            self.mediator = mediator
            self.light = "OFF"
    
        def turn_on(self):
            self.light = "ON"
            self.mediator.notify(self, "ON")
            print(f"{self.name} light is ON")
    
        def turn_off(self):
            self.light = "OFF"
            print(f"{self.name} light is OFF")
    
    

使用方法:

    mediator = LightMediator()

    living_room = Room("Living Room", mediator)
    kitchen = Room("Kitchen", mediator)

    mediator.add_room(living_room)
    mediator.add_room(kitchen)

    living_room.turn_on()  # Kitchen light will turn OFF
    kitchen.turn_on()      # Living Room light will turn OFF

利点:

  1. 疎結合: Mediatorを用いることで、オブジェクト間の直接の依存関係を減少させ、システム全体の結合度を低く保つことができます。
  2. 再利用: 各ColleagueオブジェクトがMediatorにのみ依存するため、それらを再利用しやすくなります。
  3. 集中制御: オブジェクト間の通信を一つの場所に集中させることができるため、変更や拡張が容易になります。

Mediator パターンは、多くのオブジェクトが密接に相互作用する場合や、オブジェクト間の通信を一元管理したい場合に特に役立ちます。

Discussion