Паттерн (шаблон) проектирования — это продуманный способ построения исходного кода программы для решения часто возникающих в повседневном программировании проблем проектирования. Иными словами, это уже придуманное решения, для типичной задачи. При этом паттерн не готовое решение, а просто алгоритм действий, который должен привести к желаемому результату. Давайте рассмотрим один из наиболее часто используемых структурных паттернов — Декоратор (Decorator).
Как я уже писал ранее, существует три вида паттернов проектирования:
- Порождающие паттерны позволяют возможность выполнять инициализацию объектов наиболее удобным и оптимальным способом.
- Структурные паттерны описывают взаимоотношения между различными классами или объектами, позволяя им совместно реализовывать поставленную задачу.
- Поведенческие паттерны позволяют грамотно организовать связь между сущностями для оптимизации и упрощения их взаимодействия.
Декоратор (Decorator)– это структурный паттерн, который позволяет динамически в ходе выполнения расширять функционал объекта назначая дополнительные функциональные возможности. То есть, декоратор дает возможность удобно расширять функционал базового класса при необходимости.
Давайте рассмотрим диаграмму паттерна Декоратор.
Component — базовый класс компонента, чье поведение будет расширяться декораторами
Client — работает с компонентом, не зная о существовании декораторов
ConcreteComponent — конкретная реализация компонента
Decorator — базовый класс декоратора, предназначенный для расширения поведения компонента
ConcreteDecoratorA, ConcreteDecoratorB — конкретный декоратор, который добавляет декорируемому объекту специфическое поведение.
Рассмотрим основную логику работы паттерна Декоратор. Рассмотрим совершенно обычную и повседневную ситуацию, с которой сталкивался практически любой программист – он (ну или она) проголодался и пошел в ближайший ларек за шаурмой (ну или шавермой). В продаже имеется совершено обычная шаурма, но кроме того существуют дополнительные опции, сырный или арабский лаваш, добавки в виде сыра, грибов, имбиря и аджики. И вот представьте себе, как выглядело бы меню в этом ларьке, если бы были перечислены все виды шаурмы:
- Обычная шаурма – 100 руб.
- Шаурма с грибами – 110 руб.
- Шаурма с имбирем – 110 руб.
- Шаурма с сыром – 110 руб.
- Шаурма с грибами и сыром – 120 руб.
- Шаурма с грибами и имбирем – 120 руб.
- Шаурма с грибами, имбирем и сыром – 130 руб.
- Обычная шаурма в сырном лаваше – 110 руб.
- и так далее…
И так далее очень-очень много строчек. И чтобы запрограммировать все эти виды шармы пришлось бы создавать огромное количество классов. И для того, чтобы упростить данный механизм взаимодействия удобно использовать паттерн проектирования Декоратор, который позволит динамически определять количество добавок и варьировать от их наличия стоимость конечного продукта.
Продолжение, с деталями реализации на языке C# доступно по ссылке https://shwanoff.ru/decorator/