N'est-il pas un peu "sale" ?
Bonjour,
Cela fait un petit moment que je m'interroge sur le DP décorateur le trouvant un peu "sale".
Je n'ai pas vraiment de problèmes avec les autres DPs (à part le visiteur que je préfère éviter quand je peux), mais je bloque un peu pour le DP décorateur.
Déjà parce que je trouve sa syntaxe un peu lourde surtout si on a plusieurs décorateurs (1) :
Code:
MaClasse A = new DecorateurA( new DecorateurB( new DecorateurC( new ConcreteClasse ) ) );
A partir d'un certain nombre de décorateur, cela devient illisible.
Ensuite, parce que ajouter un décorateur change "l'instance" (2) :
Code:
1 2 3
| Chevalier a = new ConcreteChevalier;
//....
Chevalier b = new DecorateurBouclier(a); |
a n'est pas la même chose que b.
Si on a des références sur a dans le code, si on rajoute un décorateur, soit il faut mettre à jour toute ces références :aie: soit on va utiliser a comme un chevalier dans un bout de code et comme un "Chevalier avec bouclier" ailleurs dans le code :?.
De plus, le fait de ne pas pouvoir retirer un décorateur me semble pas "génial" (3).
Je ne comprend donc pas pourquoi on a pas :
- ConcreteChevalier héritant de/implémentant X ;
- Decorateur héritant de/implémentant X ;
- et une classe Chevalier se comportant comme un "proxy".
Grosso-modo avoir :
Code:
1 2 3
| Chevalier a = new Chevalier; // en interne créé un ConcreteChevalier
for( int i = 0; i < NB ; ++i) // exemple
a.add( decorateurs[i] ); |
C'est à dire presque considérer Chevalier comme un "container" de Decorateurs ayant pour dernier élément un ConcreteChevalier.
Je résous donc les problèmes 1,2 et 3.
De plus, je trouve que c'est plus intuitif pour un utilisateur.
Par exemple, quand on débute en Java et qu'on veut utiliser des fichiers, on ne comprend pas trop si on ne connaît pas le DP décorateurs.
Alors qu'une syntaxe : Fichier( ConcreteFile cf, Filtre f...); me semble bien plus claire (Filtre = Décorateur).
Pourquoi le DP décorateur est-il donc tel qu'il est ? Est-ce que je passe à côté de quelque chose ?
En effet, si en Java on les utilise pour les I/O, et qu'on l'a intégré dans les DPs, je pense qu'il y a bien une raison.