Назад к вопросам
Middle+
115
questionbank

Что такое паттерн посредник (Mediator)?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Паттерн Посредник (Mediator) — это поведенческий паттерн проектирования, который определяет объект, инкапсулирующий способ взаимодействия множества объектов. Он поощряет слабую связанность, не позволяя объектам ссылаться друг на друга напрямую. Вместо этого объекты взаимодействуют через объект посредника.

Ключевые компоненты:

  • Mediator (Посредник): Определяет интерфейс для связи с объектами Участников.
  • ConcreteMediator (Конкретный Посредник): Реализует интерфейс Посредника и координирует взаимодействие между Участниками. Он знает всех участвующих Участников и берет на себя ответственность за управление и маршрутизацию их сообщений.
  • Colleague (Участник): Каждый класс Участника знает о своем объекте Посреднике, но не знает о других Участниках. Участники общаются, отправляя или получая сообщения через Посредника.

Преимущества:

  • Уменьшает связанность: Участники не зависят друг от друга напрямую, что облегчает изменение, расширение и повторное использование отдельных Участников.
  • Упрощает управление взаимодействиями: Логика взаимодействия централизована в Посреднике, что делает ее более понятной и простой в модификации.
  • Повышает гибкость: Новые типы Участников могут быть добавлены без изменения существующих Участников или Посредника, при условии, что Посредник способен их обрабатывать.

Недостатки:

  • Может стать Монолитом: Посредник можетA стать слишком сложным и содержать слишком много логики, если не проектировать его carefully.
  • Производительность: Централизация взаимодействия может потенциально создавать узкое место в производительности в highly interactive системах.

Пример:

# Интерфейс Посредника
class Mediator:
    def notify(self, sender, event):
        pass

# Конкретный Посредник
class ConcreteMediator(Mediator):
    def __init__(self):
        self._colleague1 = None
        self._colleague2 = None

    def set_colleague1(self, c):
        self._colleague1 = c

    def set_colleague2(self, c):
        self._colleague2 = c

    def notify(self, sender, event):
        if isinstance(sender, ConcreteColleague1):
            if event == "EventA":
                print("Mediator reacts on EventA and triggers operations.")
                self._colleague2.operation_c()
        elif isinstance(sender, ConcreteColleague2):
            if event == "EventB":
                print("Mediator reacts on EventB and triggers operations.")
                self._colleague1.operation_d()

# Класс Участника
class BaseColleague:
    def __init__(self, mediator):
        self._mediator = mediator

# Конкретные Участники
class ConcreteColleague1(BaseColleague):
    def operation_a(self):
        print("Colleague 1 performs operation A.")
        self._mediator.notify(self, "EventA")

    def operation_d(self):
        print("Colleague 1 performs operation D.") # Вызывается Посредником

class ConcreteColleague2(BaseColleague):
    def operation_b(self):
        print("Colleague 2 performs operation B.")
        self._mediator.notify(self, "EventB")

    def operation_c(self):
        print("Colleague 2 performs operation C.") # Вызывается Посредником

# Использование
mediator = ConcreteMediator()

colleague1 = ConcreteColleague1(mediator)
colleague2 = ConcreteColleague2(mediator)

mediator.set_colleague1(colleague1)
mediator.set_colleague2(colleague2)

print("Client triggers operation A.")
colleague1.operation_a()

print("\nClient triggers operation B.")
colleague2.operation_b()