Паттерн «Декоратор» (с примерами на C#, Java и PHP)

Паттерн «Декоратор» (Decorator) предназначен для добавления объекту нового функционала без порождения производных классов.

«Декоратор» имеет то же альтернативное англоязычное название, что и «Адаптер» — «Wrapper» (Обёртка). Но, между этими паттернами есть принципиальное отличие.

«Адаптер» преобразует интерфейс исходного класса к интерфейсу другого вида, который совместим с соответствующим окружением. В свою очередь «Декоратор» оставляет первоначальный интерфейс без изменений и расширяет функционал в его рамках.

Как это выглядит будет показано позже в примерах кода. Пока же рассмотрим составляющие паттерна.

Данная особенность также позволяет добавлять новые возможности для классов, для которых по тем или иным причинам создать наследников невозможно.

Структура паттерна «Декоратор» показана на схеме ниже.

Паттерн «Декоратор» состоит из следующих компонентов:

  • Component (Компонент) – определяет интерфейс для объектов функционал которых может быть расширен при помощи декоратора;
  • ConcretteComponent (Конкретный компонент) – определяет сам объект функционал которого может быть расширен при помощи декоратора;
  • Decorator (Декоратор) – хранит ссылку на объект Component и определяет соответствующий ему интерфейс;
  • ConcreteDecorator (Конкретный декоратор) – непосредственно добавляет дополнительный функционал объекту Component.
Примеры реализации

Далее приведены примеры реализации паттерна «Декоратор» для трёх языков программирования: C#, Java и PHP.

C#

Component в нашем примере будет реализован в виде интерфейса.

В свою очередь ConcreteComponent будет уже в виде класса, реализующего этот интерфейс.

Decorator реализуем в виде абстрактного класса.

Также добавим в наш пример два конкретных декоратора:

Обратите внимание. Расширение функционала осуществляется именно в конкретных декораторах в методах Operation путём вызова «родного» метода Operation объекта IComponent и последующего выполнения дополнительных операций уже в самих декораторах.

Теперь покажем работу всех компонентов паттерна «Декоратор» вместе.

Вывод представленной выше программы:

Java

Составим аналогичную программу для Java.

Компонент:

Конкретный компонент:

Декоратор:

Конкретные декораторы:

Всё вместе:

PHP

И в завершение пример на PHP (пример написан на PHP 7).

Компонент:

Конкретный компонент:

Декоратор:

Конкретные декораторы:

Всё вместе:

Источники
  1. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приёмы объектно-ориентированного проектирования. Паттерны проектирования.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *