Также известен как Обертка

Взглянув на систему способностей, я могу сделать ее более модульной, добавив Delay Decorator. Декоратор будет способностью и будет иметь собственную реализацию использования. Теперь вместо повторной реализации кода FireBall или наследования от Fireball он будет использовать композицию, чтобы иметь способность, которую он задерживает. Таким образом, мы можем отложить любую возможность включения другого Delay Decorator.

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

Это известно как шаблон декоратора.

Определение шаблона декоратора

В объектно-ориентированном программировании шаблон декоратора — это шаблон проектирования, который позволяет динамически добавлять поведение к отдельному объекту, не влияя на поведение других объектов из того же class. [1] Шаблон декоратора часто полезен для соблюдения принципа единой ответственности, поскольку он позволяет разделить функциональность между классами с уникальными областями интереса. [2] Использование декоратора может быть более эффективным чем создание подклассов, потому что поведение объекта можно улучшить, не определяя совершенно новый объект.

Источник: https://en.wikipedia.org/wiki/Decorator_pattern

Это означает, что он позволяет пользователю добавлять новые функции к существующему объекту, не изменяя его структуру. Этот тип шаблона относится к структурному шаблону, поскольку этот шаблон действует как оболочка для существующих классов. Он реализует интерфейс и перенаправляет на него все запросы. Он также выполняет дополнительные функции до/после пересылки запроса. В качестве альтернативы им также предлагаются шаблоны адаптера и шаблона фасада, которые решают проблемы по-своему. Шаблон декоратора иногда используется в сочетании с шаблоном фасада. Подробнее об этом паттерне на w3sDesign на https://w3sdesign.com/?gr=s04&ugr=struct#

Это позволяет мне добавлять модификаторы или изменять способ работы способностей.

Декоратор как абстрактный класс

Иногда вы увидите, что это реализовано вот так. Возьмите декоратор как абстрактный класс, который наследуется от интерфейса, а затем от него наследуется Concrete Decorator. Это видно на примерах здесь https://en.wikipedia.org/wiki/Decorator_pattern#C#

Выполнение

Отложенная способность

Я создаю Delayed Decorator, используя интерфейс IAbilty.

Я заставляю отложенный декоратор содержать IAbility

Конечно, мне нужно убедиться, что способность установлена ​​как в конструкторе.

Наконец, я реализую интерфейс IAbility.

Теперь у меня есть отложенная способность декоратора, которую я могу использовать. В моем классе «Управление способностями», где я установил способность как способность «Огненный шар», я вместо этого установил новую способность «Отложенный декоратор», которая содержит способность «Огненный шар».

Теперь, когда я использую способность «Огненный шар», я использую способность «Задержка».

Способность к охлаждению

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

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

m_currentAbility = new CoolDownDecorator(new RageAbility())

Получить код

Как всегда, код для этого можно найти в моем Git-хабе.

https://github.com/JamesLaFritz/Design-Patterns-For-Unity/tree/release-DecoratorPattern