Посредник (Mediator)

Метафора

 

Хорошей метафорой будет башня управления в аэропорту, через неё пилоты запрашивают разрешение на посадку и взлёт, а уже диспетчер в ней решает кто, куда и в каком порядке будет приземляться и взлетать. Нет необходимости во взаимодействии пилотов друг с другом напрямую.

 

Назначение

 

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

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

 

Диаграмма

 

Посредник

Посредник

 

Посредник (AbstractMediator) определяет интерфейс для обмена информацией между коллегами. Каждый коллега знает о своём посреднике и предоставляемом им интерфейсе коммуникации и использует его для связи с другими коллегами, не обращаясь к ним напрямую.

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

 

Пример

 

В примере реализовано что-то вроде чата, как видно дополнительных иерархий тут нет (для упрощения). Клиенты знают о наличии посредника и об интерфейсе взаимодействия через него.