Шаблон декоратор (Decorator)

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

Но давайте приведем практический пример из жизни. Допустим, вы обладаете своим автосервисом. Каким образом вы станете рассчитывать сумму в счетах за оказываемые услуги? Как правило, вы выбираете одну услугу, после чего динамически добавляете к ней расценки на конкретные предоставляемые услуги, то есть пока не будет сформирована окончательная стоимость. И вот тут каждый тип услуги и будет декоратором.

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

Но давайте лучше перейдем к коду. Теперь приведем пример с кофе. Итак, поначалу мы имеем простой Coffee и интерфейс, его реализующий:

Однако мы желаем сделать наш код расширяемым, дабы в случае надобности мы могли его менять. Следовательно, можно сделать ряд дополнений (то есть мы используем декораторы):

Ну а теперь мы уже можем готовить разный Coffee:

Вот и все. Если интересует, вот пример реализации на Java: https://github.com/iluwatar/java-design-patterns/tree/master/decorator.

По материалам https://github.com/kamranahmedse/design-patterns-for-humans.