Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

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

Назначение

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

Применимость

Используйте паттерн посредник, когда:

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

Структура

Участники

  • Mediator - посредник - определяет интерфейс для обмена информацией с Collegue;
  • ConcreteMediator - конкретный посредник:
    • реализует кооперативное поведение, координируя действия объектов Collegue;
    • владеет информацией о коллегах и подсчитывает их;
  • Классы Collegue - коллеги:
    • каждый класс Collegue "знает" о своем объекте Mediator;
    • все коллеги обмениваются информацией только с посредником, так как при его отсутствии им бы пришлось общаться между собой напрямую.

Результаты

  • снижает число порождаемых подклассов. Посредник локализует поведение, которое в противном случае пришлось бы распределять между несколькими объектами. Для изменения поведения нужно породить подклассы только от класса посредника Mediator, классы коллег Collegue можно использовать повторно без каких бы то не было изменений.
  • устраняет связанность между коллегами. Посредник обеспечивает слабую связанность коллег. Изменять классы Collegue и Mediator можно независимо друг от друга;
  • упрощает протоколы взаимодействия объектов. Посредник заменяет дисциплину взаимодействия "все со всеми" дисциплиной "один со всеми", т.е. один посредник взаимодействует со всеми коллегами. Отношения вида "один ко многим" проще для понимания, сопровождения и расширения;
  • абстрагирует способ кооперирования объектов. Выделение механизма посредничества в отдельную концепцию и инкапсуляцию ее в одном объекте позволяет сосредоточиться именно на взаимодействии объектов, а не на их индивидуальном поведении. Это дает возможность прояснить имеющиеся в системе взаимодействия.
  • централизует управление. Паттерн посредник переносит сложность взаимодействия в класс-посредник. Поскольку посредник инкапсулирует протоколы, то он может быть сложнее отдельных коллег. В результате сам посредник становится монолитом, который трудно сопровождать.