Как следует из названия, все дело в украшении твердого объекта.

Почему Decorator?

Давайте посмотрим на это на примере!

В игре мы создали класс Atom. У разных атомов разная степень движения. Скажите, например, : -

Atom 1, имеет только 1 градус движения - по оси x
Atom 2, имеет 2 градуса движения - по осям x и y
Atom 3, снова имеет 2 степени движения - по осям y и z.

Создание отдельного класса для этого было бы утомительной задачей. Например, : - MovableX, MovableXZ, MovableYZ… и т. Д.

Одна альтернатива - следовать шаблону декоратора. (Потому что меньше дублирования кода).

Создайте MovableX, MovableY, MovableZ, а затем используйте комбинации для динамического добавления дополнительной ответственности к отдельному атому.

E.g. :-

Для класса MovableXY мы могли бы создать это

IAtom atom_x_y = new MovableX( new MovableY( new Atom() ) )

Структура проекта:

Реализация на Java:

Еще один другой пример!

Возьмем, к примеру, вид из окна (сплошной объект). Допустим, нам нужно украсить Window новым свойством Прокрутка (дополнительная ответственность).

Количество возможных комбинаций (здесь подойдет комбинация, а не перестановка) → Горизонтально, Вертикально, Горизонтально _ & _ Вертикально.

Давайте посмотрим, как в этом случае можно использовать декоратор.

  1. Создайте Интерфейс (код для интерфейса, а не для реализации)

IWindow.java

2. Создайте твердый объект (реализация интерфейса).

BasicWindow.java

3. Создайте абстрактный прокручиваемый декоратор, который вмещает твердый объект.

ScrollDecorator.java

4. Создайте классы декоратора из Scroll-Decorator.

ПРИМЕЧАНИЕ:

  • объект window присутствует в классе Abstract.
  • Логика прокрутки может быть включена в render ().

VerticalScrollDecorator.java

HorizontalScrollDecorator.java

5. Программа драйвера

DecoratorDriver.java

  • Используется IWindow, а не какой-либо конкретный класс.
  • Обратите внимание на порядок вызова конструкторов.

Это было интересно?

Пожалуйста, покажите свою поддержку 👏. Чтобы прочитать полную серию, нажмите ниже.



Ссылка:

Отказ от ответственности:
Я сам только начал изучать шаблоны проектирования. Если вы обнаружите какие-либо проблемы, не стесняйтесь размещать их в разделе комментариев ниже. Спасибо, что дочитали до сих пор 😄