В программировании существует множество поведенческих паттернов проектирования, и сегодня мы рассмотрим шаблон проектирования посредника.

Шаблон проектирования посредника используется для отделения компонентов проекта путем введения между ними дополнительного слоя, поэтому все взаимодействие между этими объектами будет проходить через этот слой, и эти взаимодействующие компоненты не будут знать друг друга. Это дает все привилегии слабосвязанной структуры, как показано ниже:

  • Снижает стоимость обслуживания
  • Легко расширяемый

Одним из реальных примеров использования шаблона проектирования посредника могут быть официанты в ресторанах. Клиенты заказывают еду, не разговаривая непосредственно с поварами, но заказы принимают официанты, и через официантов они могут узнать, когда заказ будет готов. Таким образом, поварам не нужно подходить к каждому клиенту индивидуально и доставлять еду индивидуально, а все, что они знают, это официанта, через которого они получат заказ, и они отдают им готовые блюда, поэтому процесс для них менее сложен.

Давайте посмотрим на это на реальном примере кода. В нашем случае мы создаем чат-приложение с несколькими пользователями, в котором они могут общаться друг с другом в группе. Для этого давайте создадим интерфейс «ChatApp» в качестве объекта Mediator:

Затем мы создадим схему Component с абстрактным классом User, как показано ниже:

Теперь пришло время создать реализацию как Посредника, так и Компонентов:

Итак, то, что мы сделали выше, выглядит следующим образом. Во-первых, мы создали наш интерфейс Mediator как «ChatApp», чтобы в дальнейшем вести себя как слой между нашими компонентами. Помните, что мы используем именно этот интерфейс в качестве дополнительного слоя в наших компонентах, а не его реализацию! Затем мы создаем его реализацию для перехвата вызовов и их обработки в виде класса «ChatAppImpl».

Затем мы создаем наш абстрактный класс Component с именем «User» в качестве фрейма для любых других классов компонентов, поэтому он обладает фундаментальными методами, которые каждый из наших Компоненты должны обладать классами.

После этого созданный нами класс «UserImpl» ведет себя здесь как конкретный компонент, внутри которого реализованы методы «User».

Итак, чего мы в итоге добились благодаря этому, как видите, когда один пользователь отправляет сообщение в чат, вместо того, чтобы держать в нем других пользователей и отправлять это сообщение по отдельности, пользователь просто передает это сообщение в Медиатор (в нашем случае это «ChatApp») и пусть он этим занимается.

В целом, одно из основных преимуществ Шаблона проектирования посредника заключается в том, чтобы отделить нежелательное поведение, локализовав его в объекте-посреднике и обеспечив слабую связанную среду между компонентами.

Однако иногда это может привести к тому, что сложность отдельного объекта-посредника превысит торговую сложность взаимодействия компонентов. Это означает, что чем больше взаимодействий между компонентами, тем сложнее становится медиатор.

Код доступен в репозитории Github здесь.

Есть еще 11 шаблонов проектирования поведения:

  1. Шаблон проектирования цепочки ответственности
  2. Шаблон проектирования интерпретатора
  3. Шаблон проектирования итератора
  4. Шаблон проектирования команд
  5. Шаблон дизайна Memento
  6. Шаблон проектирования "Нулевой объект"
  7. Шаблон проектирования Observer
  8. Шаблон проектирования состояния
  9. Шаблон разработки стратегии
  10. Шаблон проектирования метода шаблона
  11. Шаблон проектирования посетителей