Сделай Сам Свою Работу на 5

Использование паттерна Decorator





Лабораторная работа № 5

Библиотека ввода/вывода. Паттерн Decorator

Теоретические сведения

Назначение паттерна Decorator (декоратор, wrapper, обертка)

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

Рекурсивно декорирует основной объект.

Паттерн Decorator использует схему "обертываем подарок, кладем его в коробку, обертываем коробку".

Решаемая проблема

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

Обсуждение паттерна Decorator

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

Рис 1. UML-диаграмма классов паттерна Decorator

Эта схема имеет существенный недостаток - число классов сильно разрастается.



Паттерн Decorator дает клиенту возможность задавать любые комбинации желаемых "особенностей".

 

1 Widget* aWidget = new BorderDecorator(

2 new HorizontalScrollBarDecorator(

3 new VerticalScrollBarDecorator(

4 new Window( 80, 24 ))));

5 aWidget->draw();

Гибкость может быть достигнута следующим дизайном.

 

Другой пример каскадного соединения свойств (в цепочку) для придания объекту нужных характеристик:

1 Stream* aStream = new CompressingStream(

2 new ASCII7Stream(

3 new FileStream( "fileName.dat" )));

4 aStream->putString( "Hello world" );

 

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

Обратите внимание, паттерн Decorator позволяет добавлять объекту новые обязанности, не изменяя его интерфейс (новые методы не добавляются). Известный клиенту интерфейс должен оставаться постоянным на всех, следующих друг за другом "слоях".



Отметим также, что основной объект теперь "скрыт" внутри объекта-декоратора. Доступ к основному объекту теперь проблематичен.

 

Структура паттерна Decorator

Клиент всегда заинтересован в функциональности CoreFunctionality.doThis(). Клиент может или не может быть заинтересован в методах OptionalOne.doThis() и OptionalTwo.doThis(). Каждый из этих классов переадресует запрос базовому классу Decorator, а тот направляет его в декорируемый объект.

 

 

Пример паттерна Decorator

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

Хотя картины можно повесить на стену и без рамок, рамки часто добавляются для придания нового стиля.

 

 

Использование паттерна Decorator

Подготовьте исходные данные: один основной компонент и несколько дополнительных (необязательных) "оберток".

Создайте общий для всех классов интерфейс по принципу "наименьшего общего знаменателя НОЗ" (lowest common denominator LCD). Этот интерфейс должен делать все классы взаимозаменяемыми.

Создайте базовый класс второго уровня (Decorator) для поддержки дополнительных декорирующих классов.

Основной класс и класс Decorator наследуют общий НОЗ-интерфейс.

Класс Decorator использует отношение композиции. Указатель на НОЗ-объект инициализируется в конструкторе.

Класс Decorator делегирует выполнение операции НОЗ-объекту.

Для реализации каждой дополнительной функциональности создайте класс, производный от Decorator.

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

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

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.