Что такое паттерн "Посредник" (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();

Когда стоит использовать паттерн «Посредник»?

  • Нужно снизить связанность множества компонентов.
  • Необходимо централизовать логику взаимодействия.
  • Желаете упростить поддержку и расширение сложных систем.
  • В системах с частыми коммуникациями между объектами.

Отличие от других паттернов

  • В отличие от наблюдателя, посредник централизует взаимодействия, а не просто информирует подписчиков.
  • В отличие от фасада, посредник управляет взаимодействиями между объектами, а не просто упрощает интерфейс подсистемы.

Плюсы паттерна

  • Уменьшает связанность между объектами.
  • Централизует контроль взаимодействия.
  • Улучшает модульность и читабельность кода.
  • Облегчает изменение и расширение системы.

Минусы паттерна

  • Посредник может стать слишком сложным и монолитным.
  • Вводит дополнительный уровень абстракции.
  • Требует тщательного проектирования, чтобы не превратиться в «бог-объект».