Decorateur controlé et fabrique

Stratégie temps réel : Control des soldats armés

L'utilisation du décorateur pour gérer l'extension du comportement pose quelques problèmes :

Pour remédier à ces problèmes, nous allons créez une nouvelle classe UnitSimple qui utilisera notre décoration pour implémenter les méthodes strike et parry et qui ajoutera les fonctions d'ajout et de suppression d'armes. Ce changement impose de renommer les classes que nous avions fait précedement:

exercice 1 : UnitSimple

En utilisant le code des décorateurs téléchargeable ici, écrivez la classe abstraite UnitSimple et les deux nouvelles classes HorseMan et InfantryMan qui doivent fonctionner avec le programme suivant:

void main(String argv[]) {
  UnitSimple hm = new HorseMan();
  UnitSimple im = new InfantryMan();
  im.parry(hm.strike());
  try {
   im.addSword();
   hm.addShield();
   hm.parry(im.strike());
   im.addShield(); 
   im.addSword(); // Lève une exception car deux armes maximum
  }catch(ImpossibleExtensionException e) {}
}

exercice 2: Les armes

La solution précédente n'est pas très extensible car il faut ajouter une méthode à chaque fois que l'on veut ajouter un nouveau type d'arme. En considérant qu'une arme est une Fabrique de BehaviorExtension (Method Factory) proposez une solution qui permet de faire fonctionner le code suivant :

void main(String argv[]) {
  UnitSimple hm = new HorseMan();
  UnitSimple im = new InfantryMan();
  Equipment sw = new Sword();
  Equipment sh = new Shield();
  Equipment sw2 = new Sword();
  try { 
    im.parry(hm.strike());
    im.addEquipement(sw);
    hm.addEquiment(sw); // Lève une exception car l'arme est déjà attaché
  }catch(ImpossibleExtensionException e) {}

  try {
   im.removeEquiment(sw);
   hm.addEquipement(sw);
   hm.addEquipement(sh);    
   hm.addEquiment(sw2); // Lève une exception car deux armes maximum
  }catch(ImpossibleExtensionException e) {}
}

Implémentez votre solution.