Декоратор (Decorator)

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск

К основной странице курса

Другое название

Обертка (Wrapper)

Назначение

Динамически добавляет объекту новые свойства (без использования наследования, на этапе выполнения).

Описание

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

Паттерн декоратор предлагает следующий подход: поместить компонент в другой объект, называемый Декоратором, который как раз и добавляет новые свойства.

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

Декораторы могут вкладываться друг в друга, добавляя любое количество новых свойств.

Назначение

Декоратор предназначен:

  • для динамического добавления обязанностей объектам
  • для реализации обязанностей, которые могут быть сняты с объекта
  • когда расширение путем порождения подклассов неудобно

Реализация

Диаграмма классов

DecoratorCommon.png

Участники

Пример

Пример. Файловые потоки в C#.

Stream f = new FileStream(fileName, FileMode.Create);
Stream gz = new GZipStream(f, CompressionMode.Compress);

или единым запросом:

Stream gz = new GZipStream(new FileStream(fileName, FileMode.Create), CompressionMode.Compress);

GZipStream декорирует поток, придавая ему дополнительное свойство сжатия. GZipStream, как и FileStream, наследуется от типа Stream.

Среди других декораторов: BufferedStream, CryptoStream.

Хороший пример из книги Фримена. Кофе и дополнения: шоколад, ваниль, молоко, пена...

Код

Достоинства и недостатки

Варианты