赞助人装饰器私有属性设置为 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);
}
我正在学习装饰器模式。这是一个非常简单的角色设计,应该能够装备不同的物体。当角色的所有属性都设置为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);
}