调用装饰器方法时出现问题 (Java)

Having issues calling a decorator method (Java)

正在从事一个小组项目,该项目本质上是基于文本的口袋妖怪盗版。我的 class 伙伴和我得到了一个 UML 来工作,所以我不能接受任何会添加方法或更改它们的参数的解决方案。但本质上我们 运行 遇到的问题是:

有一个单例 PokemonGenerator class,它有一个方法 generateRandomPokemon(int level) 从 23 个 Pokemon 列表中随机挑选一个 Pokemon 然后给它们每超过 1 级,他们的攻击力或 HP 都会随机增加一个增益。我只想谈谈 AttackUp,因为它们的功能相同。所以 generateRandomPokemon 方法创建了一个 pokemon 然后有这个小点

for(int x = 1; x < level; x++){
  addRandomBuff(randP); 
}

调用方法 Pokemon addRandomBuff(Pokemon p) 的地方。还有一个 class 称为 PokemonDecorator,从它延伸出来的是一些 classes:AttackUp、AttackDown、HpUp 和 HpDown。 AttackUp的构造函数内容如下:

public AttackUp(Pokemon p)
  {
    super(p, " +ATK", 0);
  }

如 PokemonDecorator 的构造函数所示:

public PokemonDecorator(Pokemon p, String extraName, int extraHp)
  {
    super(p.getName() + extraName, p.getHp() + extraHp, p.getMaxHp() + extraHp);
    pokemon = p;
  }

(PokemonDecorator 有成员 Pokemon p,并扩展抽象 class Pokemon,其构造函数是 Pokemon(name, hp, maxHp))。 无论如何,我们在尝试使用 buff/debuff classes 时会遇到各种问题 运行。 None 的增益出现在它们应该附着的神奇宝贝上。这是我们当前迭代的方法(虽然它已经经历了很多次迭代)

Pokemon addRandomBuff(Pokemon p)
  {
    int buff = (int)(Math.random()* 2) + 1;
    if(buff == 1)
    {
      p = new AttackUp(p);  
    }
    if(buff == 2)
    {
      p = new HpUp(p);
    } 
    return p; 
  }

当代码运行时,如果附加了 buff,则 Pokemon 的名称应显示“+ATK”或“+HP”,而没有。设置 p = 装饰器对我来说似乎不正确,但这是我可以编写它而不会出现有关在 PokemonGenerator class.

中没有 AttackUp 或 PokemonDecorator 实例的编译器错误的唯一方法

在您问题的代码中,您有三个不同的 Pokemon 变量,名为 p:一个在 AttackUp 的构造函数范围内,一个在 PokemonDecorator 的构造函数和 addRandomBuff 方法范围内的一个构造函数。

当您说 p = new AttackUp(p);p = new HpUp(p); 时,这会为 addRandomBuff 方法中的 p 分配一个新值。但是请注意,它不会更改从调用方法传入的 Pokemon 的赋值,并且由于您使用的装饰器模式不会改变原始 Pokemon 对象的任何状态,因此这就是为什么您最终没有看到变化的原因。

然而,你们很亲近;在您的 for 循环中,尝试将行更改为:

randP = addRandomBuff(randP);