Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns via C#.pdf
Скачиваний:
154
Добавлен:
17.03.2016
Размер:
13.25 Mб
Скачать

129

Мотивация

Рассмотрим использование техники декорирования на примере простейшей программы для построения графических интерфейсов. Скажем, программа должна уметь добавлять новое состояние (рамку) или поведение (возможность прокрутки) к элементу управления TextView (TextBox), который отображает текст в окне. По умолчанию TextView не имеет полос прокрутки, поскольку они не всегда нужны. Если полосы прокрутки понадобятся, их можно добавить при помощи декоратора ScrollDecorator. Если понадобится добавить рамку вокруг объекта TextView, ее можно добавить при помощи декоратора BorderDecorator. Также возможно одновременно использовать оба декоратора, тогда отображаемый объект будет иметь и полосы прокрутки, и рамку. На рисунке ниже можно увидеть графическое представление частей результата.

На диаграмме ниже показан объект класса TextView декорированный объектами классов

BorderDecorator и ScrollDecorator.

Классы ScrollDecorator и BorderDecorator являются подклассами абстрактного класса Decorator. Класс VisualComponent – это абстрактный класс для представления всех визуальных объектов.

130

Классы ScrollDecorator и BorderDecorator могут добавлять любые методы для предоставления необходимой функциональности и использоваться (декорировать) со всеми объектами типа VisualComponent.

См. Пример к главе: \009_Decorator\002_Text View

Применимость паттерна

Паттерн Decorator рекомендуется использовать, когда:

Требуется организовать возможность динамического (во время выполнения) расширения объектов.

Требуется временно расширить объект новой функциональностью, а позже эту функциональность убрать.

Результаты

Паттерн Decorator обладает следующими преимуществами:

Гибкость.

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

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

Необходимая достаточность.

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

Паттерн Decorator обладает следующими недостатками:

Потеря идентичности.

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

Идентичные объекты:

131

Индивидуальные объекты:

Наличие большого числа мелких объектов-декораторов.

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

Реализация

Полезные приемы реализации паттерна Decorator:

Соответствие интерфейсов.

Интерфейс декораторов (Decorator) должен соответствовать интерфейсу декорируемого объекта (ConcreteComponent), поэтому, как класс декорируемого объекта, так и классы декораторов должны наследоваться от общего класса (Component).

Возможность отсутствия абстрактного класса Decorator.

Нет необходимости создавать абстрактный класс Decorator если планируется добавить только одну обязанность для конкретных компонентов (ConcreteComponent). Достаточно будет создать один класс конкретного декоратора (ConcreteDecorator), и помимо его основной функциональности, возложить на него ответственность за переадресацию запросов, которая должна была лежать на базовом абстрактном классе (Decorator).

См. Пример к главе: \009_Decorator\003_ConcreteDecorator

132

Известные применения паттерна в .Net

System.Windows.Controls.Decorator

http://msdn.microsoft.com/en-us/library/system.windows.controls.decorator.aspx

System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator http://msdn.microsoft.com/ruru/library/system.data.entity.migrations.infrastructure.migratorloggingdecorator(v=vs.113).aspx

System.Windows.Controls.Primitives.BulletDecorator http://msdn.microsoft.com/ru-ru/library/system.windows.controls.primitives.bulletdecorator(v=vs.90).aspx

System.Windows.Documents.AdornerDecorator http://msdn.microsoft.com/en-us/library/system.windows.documents.adornerdecorator.aspx

Microsoft.Windows.Themes.ClassicBorderDecorator http://msdn.microsoft.com/en-us/library/microsoft.windows.themes.classicborderdecorator.aspx

System.Web.HttpBrowserCapabilitiesWrapper http://msdn.microsoft.com/ru-ru/library/system.web.httpbrowsercapabilitieswrapper(v=vs.90).aspx

System.Web.HttpApplicationStateWrapper http://msdn.microsoft.com/ru-ru/library/system.web.httpapplicationstatewrapper(v=vs.90).aspx

System.Web.HttpContextWrapper http://msdn.microsoft.com/en-us/library/system.web.httpcontextwrapper(v=vs.110).aspx

System.Web.HttpFileCollectionWrapper http://msdn.microsoft.com/en-us/library/system.web.httpfilecollectionwrapper(v=vs.110).aspx

System.Web.HttpSessionStateWrapper http://msdn.microsoft.com/en-us/library/system.web.httpsessionstatewrapper(v=vs.110).aspx

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]