Java装饰器模式

Java装饰器模式,java,design-patterns,Java,Design Patterns,我正试图在我的项目中实现Java装饰器模式。基本上,这个项目有两组战士(攻击型和防御型),我创建了一个抽象的战士类,它是两种不同类型战士的父类。攻击型战士和防御型战士的攻击场、防御场和推进场的计算方式不同。我创建了一个decorator类,该类操纵getDefense()方法,在这里我只得到防御的两倍。现在我要计算这个被装饰的战士职业的攻击、防御、提升和力量。大部分测试我都能通过,但棘手的是,当我要用不同的返回值计算两次攻击、防御和提升时。例如,防御型战士通过将防御添加到(2*级)来计算防御,而

我正试图在我的项目中实现Java装饰器模式。基本上,这个项目有两组战士(攻击型和防御型),我创建了一个抽象的战士类,它是两种不同类型战士的父类。攻击型战士和防御型战士的攻击场、防御场和推进场的计算方式不同。我创建了一个decorator类,该类操纵getDefense()方法,在这里我只得到防御的两倍。现在我要计算这个被装饰的战士职业的攻击、防御、提升和力量。大部分测试我都能通过,但棘手的是,当我要用不同的返回值计算两次攻击、防御和提升时。例如,防御型战士通过将防御添加到(2*级)来计算防御,而攻击型战士通过仅添加防御+级来计算防御。这就是我遇到麻烦的地方,因为我不知道如何在两个不同的计算中使用相同的方法两次

public class ArmoredWarriorDecorator extends Warrior {

    Warrior warrior;

    public ArmoredWarriorDecorator(Warrior warrior) {
        super(warrior);
        this.warrior = warrior;
    }

    @Override
    int getDefense() {
        int defense = (int) (2 * warrior.defense);
        return defense;
    }

    @Override
    public int calculateAttack() {
        return (int) warrior.attack + warrior.level;
    }

    @Override
    public int calculateDefense() {
        return (int) (warrior.defense * 2 + (2 * warrior.level));
    }

    /*
     * @Override public int calculateDefense() { return (int) (warrior.defense * 2 +
     * (warrior.level)); }
     */

    @Override
    public double calculateBoost() {
        return warrior.defense;
    }

}

我认为你只需要在每一个战士职业中进行一次计算


您将有两个不同的defense()实现,其中每个类都应根据类计算其防御点

假定的
CalculatedFense
getDefense
之间的区别是什么?我可以看出一个考虑了级别,而另一个不考虑,但是作为调用者,我什么时候会使用一个而不是另一个?您至少应该重命名其中一个,或者更好,首先确定是否需要两者GetDefense使用生成器模式来初始构建战士和calculateDefense是一种用于根据不同战士的级别和类型计算不同战士防御的方法。生成器模式不需要getter。我在但是我需要能够在我的decorator中使用这些方法,只需将defense字段改为乘以2。我已经在getDefense()中这样做了,但是需要以某种方式传入计算方法。
@Test
void double_defense_calculate_defense_defensive() {
    Warrior warrior = new ArmoredWarriorDecorator(new DefensiveWarrior.Builder(1).defense(10).build());
    assertSame(22, warrior.calculateDefense());
}

@Test
void double_defense_calculate_defense_aggressive() {
    Warrior warrior = new ArmoredWarriorDecorator(new AggressiveWarrior.Builder(1).defense(10).build());
    assertSame(21, warrior.calculateDefense());
}