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

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

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

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

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

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

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

Идея этого шаблона - разделить отправителей и приемников, позволяя множественным объектам обработать запрос. Запрос передается по цепочке объектов, пока один из них не обработает ее.

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

Предположим, пользователь щелкает на кнопку справки на кнопке отмеченной "Print". Кнопка содержится в шаблоне PrintDialog, который знает объект приложения, которому он принадлежит (см. предшествующую диаграмму объекта) .Диаграмма взаимодействия иллюстрирует то, как запрос посылается по цепочке:

В этом случае, ни PrintButton ни PrintDialog не обрабатывают запрос; он останавливается в Application, который может обработать его или игнорировать его. Клиент, который выдал запрос, не имеет никакой прямой ссылки на объект, который в конечном счете выполнит обработку запроса.

Каждый объект в цепочке совместно использует общий интерфейс для обработки запроса и для доступа к его преемнику в цепочке. Например, система справки могла бы определять класс HelpHandler соответствующую операцию HandleHelp:

Button, Dialog, и классы Application используют HelpHandler для осуществления запросов справки. Операция HandleHelp передает запрос преемнику по умолчанию. Подклассы могут отменять операцию, чтобы обеспечить справку при правельных обстоятельствах.

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

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

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