赞助人装饰器私有属性设置为 0.0

Patron decorator private attributes set to 0.0

我正在学习装饰器模式。这是一个非常简单的角色设计,应该能够装备不同的物体。当角色的所有属性都设置为0时,问题就来了。

public abstract class Character{
    private double damage;
    public Character();
    public void setDamage(damage){
         this.damage = damage;
    }
    public double getDamage(){return damage;}

}


public class Human extends Character{
    public Human(){
        damage = 10.00;
    }
}


public abstract class Object extends Character{
    public abstract String getDescription();
}


public class Sword extends Object{
    Character character;

    public Sword(Character character){
        this.character = character;
        updateDamage();
    }
    public String getDescription(){
          // Something
    }

    public void updateDamage(){
         character.setDamage(character.getDamage() + 2.00);
    }
}

这是一个简单的输出。

public class Main{
    public static void main(String[] args){
         Character test = new Human();
         System.out.printl(test.getDamage());
         test = new Sword(test);
         System.out.printl(test.getDamage());
 }

 // OUTPUT
 10.0
 0.0

为什么会这样?有没有比装饰器模式更好的实现?

下一行:

new Sword(test);

不会设置剑对象的伤害,而是测试(人类)装饰的那个。 Sword 的构造函数会调用没有设置伤害字段的updateDamage 方法。

要使此代码正常工作,您应该更改 Sword 的 updateDamage 方法:

public void updateDamage(){
     setDamage(character.getDamage() + 2.00);
}