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

125

Паттерн Decorator

Название

Декоратор

Также известен как

Wrapper (Обертка)

Классификация

По цели: структурный По применимости: к объектам

Частота использования

Средняя

- 1 2 3 4 5

Назначение

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

Введение

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

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

Для того чтобы летчик истребитель мог выполнять боевое задание – охранять воздушные границы государства, самого летчика недостаточно. Потребуются следующие компоненты: специальный (высотнокомпенсирующий) костюм и самолет СУ-47. Для организации полета потребуется летчика поместить в костюм, а костюм поместить в самолет. Обратите внимание, летчик не касается своим телом кресла самолета, так же, все взаимодействие с самолетом происходит через костюм. Получается некая цепочка связанных объектов: самолет костюм летчик. Почему именно такая последовательность? Потому что для вражеского пилота, целью в бою будет именно самолет Су-47, а не летчик, который управляет самолетом. Поэтому, если представить такую ситуацию объектно-ориентировано, то получается, что объект-

126

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

Структура паттерна на языке UML

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

127

Структура паттерна на языке C#

class Program

{

static void Main()

{

Component component = new ConcreteComponent(); Decorator decoratorA = new ConcreteDecoratorA(); Decorator decoratorB = new ConcreteDecoratorB();

decoratorA.Component = component; decoratorB.Component = decoratorA; decoratorB.Operation();

}

}

abstract class Component

{

public abstract void Operation();

}

class ConcreteComponent : Component

abstract class Decorator : Component

{

{

public override void Operation()

public Component Component { protected get; set; }

{

 

Console.WriteLine("ConcreteComponent");

public override void Operation()

}

{

}

if (Component != null)

 

Component.Operation();

 

}

 

}

class ConcreteDecoratorA : Decorator

class ConcreteDecoratorB : Decorator

{

{

string addedState = "Some State";

void AddedBehavior()

 

{

public override void Operation()

Console.WriteLine("Behavior");

{

}

base.Operation();

 

Console.WriteLine(addedState);

public override void Operation()

}

{

}

base.Operation();

 

AddedBehavior();

 

}

 

}

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

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