繁体   English   中英

Java 装饰图案

[英]Java Decorator Pattern

我正在尝试在我的项目中实现 Java 装饰器模式。 基本上,该项目有两组战士(进攻型和防御型),我创建了一个抽象的战士 class,它是两种不同类型战士的父级。 攻击型战士和防御型战士的攻击力、防御力和助推力场计算方式不同。 我创建了一个装饰器 class 来操纵 getDefense() 方法,在该方法中我只是获得了双倍的防御。 现在我应该计算这个装饰战士class的攻击,防御,提升和力量。 我能够通过大部分测试,但棘手的部分是当我应该用不同的返回值计算攻击、防御和提升两次时。 例如,防御战士通过将防御添加到 (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());
}

我认为您只需要继承并解决每个战士 class 内部的每个计算。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM