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

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

Добавляет дополнительные обязательства к объекту динамически. Декораторы обеспечивают гибкую альтернативу наследованию для увеличения функциональности.

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

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

Один из способов добавить обязательства - наследование. Наследование рамки из другого класса помещает рамку вокруг каждого образца подкласса. Это негибко, потому что выбор рамки сделан статически. Клиент не может управлять как и когда украсить компонент рамкой.

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

Например, предположим, что мы имеем объект TextView, который отображает текст в окне. TextView не имеет никаких полос прокрутки по умолчанию, потому что мы не всегда нуждаемся в них. Мы можем использовать ScrollDecorator, чтобы добавить их. Предположим, что мы также хотим добавить толстую черную рамку вокруг TextView. Мы можем использовать для этого BorderDecorator. Мы просто составляем декоратор с TextView, чтобы произвести желаемый результат.

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

ScrollDecorator и классы BorderDecorator - подклассы Decorator, абстрактного класса для визуальных компонентов, которые украшают другие визуальные компоненты.

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

Декоратор позволяет добавить операции для обеспечения специфических функциональных возможностей. Например, операция ScrollTo ScrollDecorator позволяют другим объектам листать интерфейс, если они знают, что объект ScrollDecorator присутствует в интерфейсе. Важный аспект этого шаблона - то, что он позволяет декораторам появляться везде, где может появляться VisualComponent. Тем самым клиент вообще не может отследить различие между украшенным компонентом и не украшенным, и так что они не зависят от художественного оформления.

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

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

Component (VisualComponent)

ConcreteComponent (TextView)

Decorator

ConcreteDecorator (BorderDecorator, ScrollDecorator)