Java 装饰器模式

时间:2021-05-24 13:05:19

标签: java design-patterns

我正在尝试在我的项目中实现 Java 装饰器模式。基本上该项目有两组战士(侵略性和防御性),我创建了一个抽象战士类,它是两种不同类型战士的父类。攻击型战士和防御型战士的攻击、防御和提升场的计算方式不同。我创建了一个装饰器类来操作 getDefense() 方法,在那里我只是获得了双重防御。现在我应该计算这个装饰战士职业的攻击,防御,提升和力量。我能够通过大部分测试,但是当我应该使用不同的返回值计算两次攻击、防御和提升时,棘手的部分出现了。例如,防御型战士通过将防御加到 (2*level) 来计算防御,而攻击型战士通过添加防御 + 等级来计算防御。这就是我遇到麻烦的地方,因为我不确定如何对两个不同的计算使用相同的方法两次。

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;
    }

}
@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());
}

1 个答案:

答案 0 :(得分:0)

我认为你只需要继承和解决每个战士类中的每个计算。

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

相关问题