Паттерны проектирования
3. Паттерн «Посредник» (Mediator).
Посредник — это один из самых распространённых паттернов проектирования. Они десятками используются в любом приложении, хотя в именах классов это практически никогда не отражается.
Назначение: определяет объект, инкапсулирующий способ взаимодействия множества объектов. Другими словами, он связывает несколько независимых классов между собой, избавляя классы от необходимости ссылаться друг на друга и позволяя тем самым их независимо изменять и анализировать.
Причины использования:
Паттерн «Посредник» идеально подходит для объединения нескольких автономных классов или компонентов. Каждый раз, когда вы задаётесь вопросом, как изолировать классы А и Б, чтобы они могли жить независимо, подумайте об использовании посредника. В этом случае посредник будет содержать всю логику взаимодействия классов. Кроме того, посредник выступает барьером, который гасит изменения в одной части системы, не давая им распространяться на другие части. Любые изменения в одном компоненте приведут к модификации его и, возможно, посредника, но не потребуют изменений в другом компоненте или его клиентах.
Замечание: Не нужно разделять с помощью посредника тесно связанные вещи. Если классы всегда изменяются совместно, то, возможно, они должны знать друг о друге. Наличие посредника лишь усложнит внесение изменений: вместо изменения двух классов придется изменять три.
Классическая диаграмма приведена в верхней части рисунка ниже:
-
Mediator — определяет интерфейс посредника. На практике базовый класс посредника выделяется редко, поэтому класс Mediator обычно содержит всю логику взаимодействия;-
ConcreteCollegue1, ConcreteCollegue2 — классы одного уровня абстракции, которые взаимодействуют друг с другом косвенным образом через посредника.Обычно взаимодействующие компоненты не содержат общего предка (если не считать класса
object) и совсем не обязательно знают о классе-посреднике. Иерархия посредников также применяется довольно редко.Явный и неявный посредник
В классической реализации паттерна независимые классы не знают друг о друге, но знают о существовании посредника и всё взаимодействие происходит через него явным образом. Такой подход применяется в паттернах «Поставщик/Потребитель» (Producer/Consumer), «Агрегатор событий» (Event Aggregator) или в других случаях, когда классы знают о существовании общей шины взаимодействия. В то же время классы низкого уровня могут и не знать о существовании посредника. Это делает их более автономными, а дизайн — более естественным. Логика взаимодействия в этом случае содержится в посреднике. См. диаграмму в нижней части рисунка ниже.
Архитектурные посредники
Паттерн «Посредник» может применяться на разных уровнях приложения. Существуют классы-посредники, компоненты-посредники, есть целые модули или слои приложения, выполняющие эту роль.
Источник: Тепляков С. "Паттерны проектирования на платформе .NET." — СПб.: Питер, 2015. Глава 3.