Обзор темы [Шаблоны проектирования]

Затем: МотивацияНазначение

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

Затем: СтруктураМотивация

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

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

Например, рассмотрим реализацию диалоговых окон в графическом интерфейсе пользователя. Диалог использует окно, чтобы представить набор widget-ов типа кнопок, меню, и полей ввода:

Часто имеются зависимости между widget-ами в диалоге. Например, кнопка становится заблокированной, когда некоторое поле ввода пусто. Выбор элемента в списке изменяет содержимое поля ввода. Наоборот, печатая текст в поле ввода автоматически выбирается одна или несколько подходящих строк в окне списка. Как только текст появляется в поле ввода, кнопки становятся доступными, что позволяет пользователю сделать что-нибудь с текстом.

Различные диалоговые окна будут иметь различные зависимости между widget-ами. Даже если диалоги отображают одни и те же виды widgets, они не могут просто многократно использовать действия классов widget; они должны быть специализированы, чтобы отражать специфические для диалога зависимости. Настройка их при помощи индивидуальной подклассификации будет утомительна, начиная с того, что много классов вовлечено.

Вы можете устранить эти проблемы, инкапсулируя коллективное поведение в отдельный объект – mediator(посредник). Посредник - ответственный за контроль и управление взаимодействием группы объектов. Mediator служит как посредник, который хранит объекты в группе и не позволяет им общаться явно. Объекты располагают информацией только о посреднике, таким образом уменьшается число связей.

Например, FontDialogDirector может быть посредником в диалоговом окне. Объект FontDialogDirector действует как hub для widgets:

Следующая диаграмма взаимодействия иллюстрирует, как объекты сотрудничают:

Имеется последовательность событий в соответствии с которой происходит передача строки из списка в поле ввода:

  1. Окно списка сообщает руководителю, что произошло изменение.
  2. Руководитель получает выделенную строку из окна списка.
  3. Руководитель передает строку полю входа.
  4. Теперь, когда поле входа содержит некоторый текст, руководитель делает кнопки доступными.

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

Имеется, как FontDialogDirector абстракция может быть интегрирована в aclass библиотеку:

DialogDirector - абстрактный класс, который определяет полное поведение ofa диалог. Клиентура вызывает операцию ShowDialog, чтобы отобразить диалог onthe экран. CreateWidgets - абстрактная операция для создания thewidgets диалога. WidgetChanged - другая абстрактная операция; widgets вызывают это, чтобы сообщить их руководителю, что они изменились. DialogDirector подклассы отменяют CreateWidgets, чтобы создать properwidgets, и они отменяют WidgetChanged, чтобы обработать изменения.

 

Затем: Составные частиСтруктура

Типичная объектная структура могла бы выглядеть следующим образом:

Составные части

·