Java: 2 декоратора на 1 объекте с переопределением одного и того же метода

#java #design-patterns #decorator

#java #шаблоны проектирования #декоратор

Вопрос:

Я работаю с шаблоном декоратора на Java и столкнулся с проблемой. У меня есть 2 декоратора, которые переопределяют один и тот же метод, и я хочу, чтобы они на одном объекте выполняли 2 реализации одновременно.

Первое, что приходит мне в голову, это просто объединить два декоратора в новый, но, вероятно, это довольно плохая идея в долгосрочной перспективе.

Каков правильный способ решения этой проблемы? Нужно ли мне идти дальше, более абстрактно, или просто отказаться от декораторов и использовать что-то еще? (как стратегия?)

Пример кода для визуализации проблемы:

 public class Attacker {

//variables, constructor...


     public void attack(Object defender) {
       defender.hp -= 10;
    }

//other methods
}
 
 public class HealAfterAttackDecorator extends Attacker {

//variables, consturctor...

     @Override
     public void attack(Object defender) {
        defender -= 10;
        this.heal();
     }
//other overrided methods
}
 
 public class StunDefenderAfterAttackDecorator extends Attacker {
//variables, consturctor...

@Override
public void attack(Object defender) {
defender -= 10;
attack.stun(defender);

}
//other overrided methods
}
 

Как объединить оглушение и исцеление в одно целое?

Комментарии:

1. Наследование — плохое решение для таких вещей. Вы должны абстрагировать логику дальше и разложить ее на такие вещи, AttackEffect из которых вы можете поддерживать несколько в a List<AttackEffect> , а затем повторять их во время атаки, активируя их все. Так defender -= 10; и тогда attackEffects.forEach(this::apply) или что-то в этом роде. Может стать еще сложнее, если вы планируете использовать пользовательские синергии и другие взаимодействия между ними.

2. Это неподходящая реализация шаблона декоратора. Шаблон декоратора основан на объектах, имеющих общий интерфейс, а декоратор обертывает существующий объект — не наследует, а делегирует — путем добавления поведения к тому, что он делает.