Problème :
- On souhaite pouvoir ajouter dynamiquement de nouvelles responsabilités à une classe existante sans modifier son interface.
- L’utilisation de l’héritage pour étendre des objets n’est pas pratique, ce qui peut arriver quand leur hiérarchie est déjà complexe.
- ajouter dynamiquement des fonctionnalités supplémentaires à un objet sans modifier sa structure ou son interface
- alternative souple à l'héritage pour composer de nouvelles fonctionnalités.
On représente des personnages dans un jeu. Ces personnages ont un poids qui est utilisé par le moteur physique.
interface Personnage {
public double getWeight() ;
}
/*
* classe concrète Humain
*/
class Humain implements Personnage {
public double getWeight(){
return 80.0 ;
}
}
// decorator
class PersonnageAvecHache implements Personnage {
private Personnage original ;
public PersonnageAvecHache(Personnage original){
this.original = original ;
}
public double getWeight(){
return original.getWeight() + 15.0 ;
}
}
// autre decorator
class PersonnageAvecChapeau implements Personnage {
private Personnage original ;
public PersonnageAvecChapeau(Personnage original){
this.original = original ;
}
public double getWeight(){
return original.getWeight() + 2.0 ;
}
}
Personnage personnage = new Humain();
personnage = new PersonnageAvecHache(personnage);
personnage = new PersonnageAvecChapeau(personnage);
System.out.println(personnage.getWeight()); // 80 + 15 + 2