2016-12-27 35 views
0

我在学习装饰器模式。这是一个非常简单的角色设计,应该能够装备不同的物体。问题出现在字符的所有属性设置为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 

这是怎么发生的?有没有比装饰模式更好的实现呢?

回答

0

下面的行:

new Sword(test); 

将不设置剑物体的损坏,但从装饰试验(人)的一个。剑构造函数将调用updateDamage方法,该方法不设置损坏字段。

若要使此代码工作,你应该从剑改变updateDamage方法:

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