В чем заключается суть паттерна проектирования Медиатор (Mediator)

Ответ

Паттерн Медиатор (Mediator) — это поведенческий паттерн проектирования, который устраняет сильную связанность между объектами (компонентами), заставляя их взаимодействовать через центральный объект-посредник («медиатор»).

Проблема, которую решает: Когда в системе много компонентов, которые должны взаимодействовать друг с другом, это приводит к сложной сети прямых связей («спагетти-код»). Каждый компонент должен знать о многих других, что затрудняет его изменение и переиспользование.

Решение: Медиатор инкапсулирует всю логику взаимодействия. Компоненты больше не ссылаются друг на друга, а только на медиатор. Они отправляют уведомления медиатору, а он уже решает, кому их перенаправить.

Ключевые преимущества:

  • Слабая связанность (Low Coupling): Компоненты не зависят друг от друга.
  • Централизованное управление: Логика взаимодействия находится в одном месте.
  • Упрощение поддержки: Легче изменять поведение системы, модифицируя только медиатор.
  • Повышение переиспользуемости: Отдельные компоненты проще использовать в других контекстах.

Пример на Python:

from abc import ABC, abstractmethod

# Интерфейс Медиатора
class Mediator(ABC):
    @abstractmethod
    def notify(self, sender: object, event: str) -> None:
        pass

# Базовый Компонент
class BaseComponent:
    def __init__(self, mediator: Mediator = None):
        self._mediator = mediator

    @property
    def mediator(self) -> Mediator:
        return self._mediator

    @mediator.setter
    def mediator(self, mediator: Mediator) -> None:
        self._mediator = mediator

# Конкретные Компоненты
class ComponentA(BaseComponent):
    def do_work(self):
        print("Компонент A выполняет действие и уведомляет медиатора.")
        self.mediator.notify(self, "EventA")

class ComponentB(BaseComponent):
    def react_on_a(self):
        print("Компонент B реагирует на событие A.")

    def react_on_c(self):
        print("Компонент B реагирует на событие C.")

class ComponentC(BaseComponent):
    def do_another_work(self):
        print("Компонент C выполняет действие и уведомляет медиатора.")
        self.mediator.notify(self, "EventC")

# Конкретный Медиатор
class ConcreteMediator(Mediator):
    def __init__(self, component_a: ComponentA, component_b: ComponentB, component_c: ComponentC):
        self._component_a = component_a
        self._component_a.mediator = self
        self._component_b = component_b
        self._component_b.mediator = self
        self._component_c = component_c
        self._component_c.mediator = self

    def notify(self, sender: object, event: str) -> None:
        if event == "EventA":
            print("Медиатор получил событие от A и передает его B.")
            self._component_b.react_on_a()
        elif event == "EventC":
            print("Медиатор получил событие от C и передает его B.")
            self._component_b.react_on_c()

# Использование
c1 = ComponentA()
c2 = ComponentB()
c3 = ComponentC()

mediator = ConcreteMediator(c1, c2, c3)

c1.do_work()
print("-" * 20)
c3.do_another_work()