调用装饰器方法时出现问题 (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);
正在从事一个小组项目,该项目本质上是基于文本的口袋妖怪盗版。我的 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);