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

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

Sobes Copilot

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

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

sobes.tech AI

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

Основные компоненты:

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

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

  • Снижение связанности: Объекты не зависят друг от друга напрямую.
  • Централизация логики взаимодействия: Вся логика взаимодействия собрана в одном месте (Посреднике).
  • Упрощение модификации: Изменение взаимодействия между объектами не требует изменения самих объектов.

Недостатки:

  • Посредник может стать монолитным: Если логика взаимодействия сложная, Посредник может разрастись.

Пример: Диалог пользовательского интерфейса.

# Интерфейс Коллеги
class Colleague:
    def __init__(self, mediator):
        self._mediator = mediator

    def set_mediator(self, mediator):
        self._mediator = mediator

# Конкретный Коллега 1
class Button(Colleague):
    def click(self):
        self._mediator.notify(self, "click")

# Конкретный Коллега 2
class TextField(Colleague):
    def set_text(self, text):
        print(f"Text field set to: {text}")

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

# Конкретный Посредник
class Dialog(Mediator):
    def __init__(self, button, text_field):
        self._button = button
        self._text_field = text_field
        self._button.set_mediator(self)
        self._text_field.set_mediator(self)

    def notify(self, sender, event):
        if isinstance(sender, Button) and event == "click":
            self._text_field.set_text("Button clicked!")

# Использование
button = Button(None)
text_field = TextField(None)
dialog = Dialog(button, text_field)

button.click()