Назад к вопросам
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()