- •Предисловие 15
- •Предисловие
- •От авторов
- •Об авторах
- •Благодарности
- •Принятые в книге обозначения
- •Технические рекомендации
- •Дополнительные ресурсы
- •Глава 1. Введение
- •1.1. Понятие паттерна проектирования
- •Определение
- •Метафора
- •1.2. Формат описания паттернов проектирования
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •1.3. Каталог паттернов проектирования
- •Порождающие
- •Структурные
- •Поведенческие
- •1.4. Техники ООП
- •Фабрика - Продукт
- •Фасад - Подсистема
- •Диспетчеризация
- •Цепочка объектов
- •Издатель-Подписчик
- •1.5. Принципы организации каталога
- •Цель паттерна
- •Уровень паттерна
- •1.6. Рекомендации по изучению паттернов
- •1.7. Рекомендации по применению паттернов
- •Глава 2. Порождающие паттерны
- •Игра - Лабиринт
- •Паттерн Abstract Factory
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода игры «Лабиринт»
- •Известные применения паттерна в .Net
- •Паттерн Builder
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода игры «Лабиринт»
- •Известные применения паттерна в .Net
- •Паттерн Factory Method
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода игры «Лабиринт»
- •Известные применения паттерна в .Net
- •Паттерн Prototype
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода игры «Лабиринт»
- •Известные применения паттерна в .Net
- •Паттерн Singleton
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода игры «Лабиринт»
- •Известные применения паттерна в .Net
- •Глава 3. Структурные паттерны
- •Паттерн Adapter
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Adapter уровня классов
- •Adapter уровня объектов
- •Структура паттерна на языке C#
- •Adapter уровня классов
- •Adapter уровня объектов
- •Участники
- •Отношения между участниками
- •Отношения между классами (для адаптера уровня классов)
- •Отношения между классами (для адаптера уровня объектов)
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Adapter уровня классов
- •Adapter уровня объектов
- •Особенности применения паттерна Adapter
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •Паттерн Bridge
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Паттерн Composite
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Известные применения паттерна в .Net
- •Паттерн Decorator
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Известные применения паттерна в .Net
- •Паттерн Facade
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Паттерн Flyweight
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •Паттерн Proxy
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •Глава 4. Паттерны поведения
- •Паттерн Chain of Responsibility
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Паттерн Command
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •Паттерн Interpreter
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Паттерн Iterator
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Классическое представление
- •Представление Microsoft .NET
- •Структура паттерна на языке C#
- •Классическое представление
- •Представление Microsoft .NET
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Известные применения паттерна в .Net
- •Паттерн Mediator
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Паттерн Memento
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Реализация
- •Паттерн Observer
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Модель вытягивания (Pull model)
- •Модель проталкивания (Push model)
- •Структура паттерна на языке C#
- •Модель вытягивания (Pull model)
- •Модель проталкивания (Push model)
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •Паттерн State
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Паттерн Strategy
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Применимость паттерна
- •Паттерн Template Method
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Применимость паттерна
- •Результаты
- •Реализация
- •Паттерн Visitor
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Применимость паттерна
- •Результаты
- •Реализация
- •Известные применения паттерна в .Net
- •Библиография
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