Что такое паттерн "Посредник" (Mediator)
Посредник — поведенческий паттерн проектирования, который обеспечивает централизованное управление взаимодействием между объектами, уменьшая их прямые связи. Вместо того чтобы объекты напрямую общались друг с другом, они взаимодействуют через посредника, что упрощает архитектуру и снижает связанность.
Представьте чат-комнату, где пользователи не отправляют сообщения напрямую друг другу, а посылают их посреднику (серверу), который перенаправляет сообщения нужным адресатам. Так объекты не знают друг о друге напрямую, а общаются только с посредником.
Преимущества паттерна «Посредник»
- Уменьшение связности между компонентами.
- Централизованный контроль логики взаимодействия.
- Упрощение поддержки и расширения кода.
- Повышение модульности системы.
Пример:
- Участники: разные объекты системы.
- Посредник управляет передачей сообщений и координацией действий между ними.
- Участники знают только посредника, а не друг друга.
Где применяется паттерн «Посредник»?
- Системы с большим числом взаимосвязанных компонентов.
- Пользовательские интерфейсы с комплексным взаимодействием элементов.
- Системы обмена сообщениями и событиями.
Пример реализации на JavaScript
// Интерфейс посредника class Mediator { notify(sender, event) {} } // Конкретный посредник class ConcreteMediator extends Mediator { constructor(componentA, componentB) { super(); this.componentA = componentA; this.componentA.setMediator(this); this.componentB = componentB; this.componentB.setMediator(this); } notify(sender, event) { if (event === "A") { console.log("Посредник реагирует на событие A и запускает B"); this.componentB.doB(); } else if (event === "B") { console.log("Посредник реагирует на событие B и запускает A"); this.componentA.doA(); } } } // Компоненты class BaseComponent { setMediator(mediator) { this.mediator = mediator; } } class ComponentA extends BaseComponent { doA() { console.log("ComponentA выполняет действие A."); this.mediator.notify(this, "A"); } } class ComponentB extends BaseComponent { doB() { console.log("ComponentB выполняет действие B."); this.mediator.notify(this, "B"); } } // Использование const componentA = new ComponentA(); const componentB = new ComponentB(); const mediator = new ConcreteMediator(componentA, componentB); componentA.doA(); componentB.doB();
Когда стоит использовать паттерн «Посредник»?
- Нужно снизить связанность множества компонентов.
- Необходимо централизовать логику взаимодействия.
- Желаете упростить поддержку и расширение сложных систем.
- В системах с частыми коммуникациями между объектами.
Отличие от других паттернов
- В отличие от наблюдателя, посредник централизует взаимодействия, а не просто информирует подписчиков.
- В отличие от фасада, посредник управляет взаимодействиями между объектами, а не просто упрощает интерфейс подсистемы.
Плюсы паттерна
- Уменьшает связанность между объектами.
- Централизует контроль взаимодействия.
- Улучшает модульность и читабельность кода.
- Облегчает изменение и расширение системы.
Минусы паттерна
- Посредник может стать слишком сложным и монолитным.
- Вводит дополнительный уровень абстракции.
- Требует тщательного проектирования, чтобы не превратиться в «бог-объект».