Décorateur

De Wiki L.A.B
Aller à : navigation, rechercher

Le décorateur est un patron de conception ( ou design pattern ) qui permet d’ajouter des responsabilités à un objet sans directement ajouter des méthodes à sa classe, ni lui créer une sous-classe. Il permet d’étendre des objets dynamiquement, à l’exécution et non à la compilation, et évite la multitude de sous classes et de redondance de code.

Pourquoi l’utiliser ?

Dans certains cas, on souhaite qu’un objet puisse avoir ou non certaines responsabilités parmi une grande liste, comme une voiture qui peut avoir certaines options parmi toutes celles qui sont disponibles. A la place de créer une longue liste de données membre ou de fonctions membre qui seront dans beaucoup de cas inutiles ou bien des sous classes qui seraient beaucoup trop nombreuses, le décorateur va permettre à la fois d’optimiser le nombre de classes à créer et d’éviter la redondance de code.

Diagramme UML

UML Décorateur.PNG


Exemple Java

Code Java

UML java.png

Texte explicatif du code

Cet exemple représente des boissons. Le composant abstrait est une Boisson. Il est étendu par deux composants concrets : le Café et le ChocolatChaud. On veut qu’il soit possible de rajouter à ces boissons de la Chatilly, du Sucre, ou les deux en même temps, et que selon ce qui est ajouté, le comportement des méthodes de la description et du prix change. Pour mettre le décorateur en place, on créer une classe abstraite Suppléments qui représente le décorateur abstrait, qui étends la classe abstraite Boisson. Cette classe abstraite contient les méthodes abstraites qui doivent être redéfinies dans les décorateurs concrets ( Le Sucre et la Chantilly ), ainsi qu’une donnée membre Boisson en protected qui représente l’instance du composant concret à décorer ( Le Café ou le ChocolatChaud). Les décorateurs concrets Sucre et Chantillly, qui vont étendre le décorateur abstrait Supplément, devront donc redéfinir les méthodes de la description et du prix. Ils devront aussi avoir un constructeur qui prend en paramètre un objet Boisson, et qui affecte cet objet à sa donnée membre. Pour utiliser ces décorateurs, il faudra utiliser les constructeurs en cascade, en utilisant le compostant concret en dernier. Par exemple : Boisson boisson = new Chantilly(new Sucre(new Café)); Cet exemple créera un café avec les suppléments sucre et chantilly.

Désavantages

Une fois l’objet décoré, il aura le type concret du décorateur. Dans le dernier exemple, même si l’objet représente un Café avec supplément Sucre et Chantilly, il sera impossible d’utiliser l’objet en tant que Café, car l’objet en question sera un Objet Chantilly, qui hérite de Suppléments, qui hérite de Boisson. L’application ne pourra donc pas utiliser le type concret de ces objets qui perdent un peu en sens. Un autre petit désavantage est la création et la décoration des objets qui peut être fastidieuse, mais qui peux facilement être compensée avec les design pattern Fabrique ou Monteur.