#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
из которых вы можете поддерживать несколько в aList<AttackEffect>
, а затем повторять их во время атаки, активируя их все. Такdefender -= 10;
и тогдаattackEffects.forEach(this::apply)
или что-то в этом роде. Может стать еще сложнее, если вы планируете использовать пользовательские синергии и другие взаимодействия между ними.2. Это неподходящая реализация шаблона декоратора. Шаблон декоратора основан на объектах, имеющих общий интерфейс, а декоратор обертывает существующий объект — не наследует, а делегирует — путем добавления поведения к тому, что он делает.