Skip to content

Decorator

Pandas edited this page Jun 18, 2017 · 1 revision

Назначение

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

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

Используйте паттерн декоратор:

  • Для динамического, прозрачного для клиентов добавления обязанностей объектам;
  • Для реализации обязанностей, которые могут быть сняты с объекта;
  • Когда расширение путем порождения подклассов по каким-то причинам неудобно или невозможно. Иногда приходится реализовывать много независимых расширений, так что порождение подклассов для поддержки всех возможных комбинаций приведет к комбинаторному росту их числа. В других случаях определение класса может быть скрыто или почему-либо еще недоступно, так что породить от него подкласс нельзя.

Структура

Imgur

Участники

  • Component - компонент: определяет интерфейс для объектов, на которые могут быть динамически возложены дополнительные обязанности;
  • ConcreteComponent - конкретный компонент: определяет объект, на который возлагаются дополнительные обязанности;
  • Decorator - декоратор: хранит ссылку на объект Component и определяет интерфейс, соответствующий интерфейсу Component;
  • ConcreteDecorator (BorderDecorator, ScrollDecorator) - конкретный декоратор: возлагает дополнительные обязанности на компонент.

Отношения

Decorator переадресует запросы объекту Component. Может выполнять и дополнительные операции до и после переадресации.

Результаты

У паттерна декоратор есть, по крайней мере, два плюса и два минуса:

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

Clone this wiki locally