Décorateur : Différence entre versions
(Page créée avec « 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 class... ») |
|||
(2 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | 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 | + | 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 ? == | == Pourquoi l’utiliser ? == | ||
Ligne 13 : | Ligne 13 : | ||
=== Code Java === | === Code Java === | ||
+ | |||
+ | [[Fichier:UML_java.png]] | ||
=== Texte explicatif du code === | === Texte explicatif du code === | ||
Ligne 20 : | Ligne 22 : | ||
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. | 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. | Pour utiliser ces décorateurs, il faudra utiliser les constructeurs en cascade, en utilisant le compostant concret en dernier. | ||
− | Par exemple : <nowiki> Boisson boisson = new Chantilly(new Sucre(new Café)); </nowiki> | + | Par exemple : |
+ | <nowiki> Boisson boisson = new Chantilly(new Sucre(new Café)); </nowiki> | ||
Cet exemple créera un café avec les suppléments sucre et chantilly. | Cet exemple créera un café avec les suppléments sucre et chantilly. | ||
Version actuelle en date du 11 octobre 2018 à 12:50
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.
Sommaire
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
Exemple Java
Code Java
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.