Я практикую брокерскую цепочку, и я получил код, некоторые его части я не могу понять. Скажем, есть Creatures
и его CreatureModifier
, чтобы изменить атаку и защиту существ.
Автор реализовал AutoCloseable
на DoubleAttackModifier
, но не сделал этого на IncreaseDefenseModifier
. Это меня смущает, почему он этого не сделал? Любая помощь или предположение приветствуются.
class CreatureModifier
{
protected Game game;
protected Creature creature;
public CreatureModifier(Game game, Creature creature)
{
this.game = game;
this.creature = creature;
}
}
class IncreaseDefenseModifier extends CreatureModifier
{
public IncreaseDefenseModifier(Game game, Creature creature)
{
super(game, creature);
// if name and arguments are correct, increase its value
game.queris.subscribe(q -> {
if (q.creatureName.equals(creature.name)
&& q.argument == Query.Argument.DEFENSE)
{
q.result += 3;
}
});
}
}
// here the author use the interface but didn't use it in IncreaseDefenseModifier
class DoubleAttackModifier extends CreatureModifier implements AutoCloseable
{
private final int token;
public DoubleAttackModifier(Game game, Creature creature)
{
super(game, creature);
// after subscribe, this token is auto-closed
token = game.queris.subscribe(q -> {
if (q.creatureName.equals(creature.name)
&& q.argument == Query.Argument.ATTACK)
{
q.result *= 2;
}
});
}
@Override
public void close() throws Exception
{
game.queris.unsubcribe(token);
}
}