Potresti crearti un'interfaccia che esponga il metodo di calcolo del bonus:
codice:
public interface PlayerBonus {
void doBonus(Player player);
}
In base ai bonus che vuoi assegnare crearai la corrispondente specializzazione:
codice:
public class MoneyBonus implements PlayerBonus<Money> {
private final Money money;
public MoneyBonus(Money money) { this.money = money; }
@Override
public void doBonus(Player player) {
player.setMoney(money);
}
}
public class StuffBonus implements PlayerBonus {
private final Something something;
public StuffBonus(Something something) { this.something = something; }
@Override
public void doBonus(Player player) {
player.setStuff(something);
}
}
L'utilizzo sarà una cosa del genere:
codice:
public class Player {
...
public void acquisisciBonus(List<Bonus> bonusList) {
for (Bonus bonus : bonusList ) {
bonus.doBonus(this);
}
}
}
public class Main {
public static void main(String[] args) {
List<Bonus> bonusList = new ArrayList();
bonusList.add(new MoneyBonus(new Money(100, "€")));
bonusList.add(new StuffBonus(new Something("funny stuff")));
Player player = ...
player.acquisciBonus(bonusList);
}
}
Che dici?