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 :
- A chaque ajout d'extension il faut changer le pointeur d'accès (perte d'identité de nos objets)
- Il est difficile d'enlever des extensions
- Il est quasiment impossible de controler les extensions ajoutées à un soldat.
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:
- Soldier -> BehaviorSoldier
- Decorator -> BehaviorExtension
- SWSword -> ConstBehaviorExtesion
- SWShield -> ConstBehaviorExtesion
- InfantryMan -> ConstBehavior
- HorseMan -> LogPowBehavior
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.