Quand devons-nous opter pour le modèle du décorateur ? Si possible, donnez-moi un exemple concret qui correspond à ce modèle...
Oui, java.io est entièrement consacré aux décorateurs.
Quand devons-nous opter pour le modèle du décorateur ? Si possible, donnez-moi un exemple concret qui correspond à ce modèle...
Les flux en Java - sous-classes de InputStream
y OutputStream
sont de parfaits exemples du modèle du décorateur.
Par exemple, l'écriture d'un fichier sur le disque :
File toWriteTo = new File("C:\\temp\\tempFile.txt");
OutputStream outputStream = new FileOutputStream(toWriteTo);
outputStream.write("Sample text".getBytes());
Ensuite, si vous avez besoin d'une fonctionnalité supplémentaire concernant l'écriture sur le disque :
File toWriteTo = new File("C:\\temp\\tempFile.txt");
OutputStream outputStream =
new GZIPOutputStream(new FileOutputStream(toWriteTo));
outputStream.write("Sample text".getBytes());
En "enchaînant" simplement les constructeurs, vous pouvez créer des moyens assez puissants d'écrire sur le disque. La beauté de cette méthode est que vous pouvez ajouter différents (dans cet exemple) OutputStream
des implémentations ultérieures. En outre, chaque implémentation ne sait pas comment les autres fonctionnent - elles fonctionnent toutes selon le même contrat. Cela permet également de tester très facilement chaque implémentation de manière isolée.
Il existe de nombreux exemples du "monde réel" où le motif décorateur peut être utilisé. Voici quelques exemples qui me viennent à l'esprit :
Head First Design Patterns contient d'autres exemples du "monde réel". Il semble que O'Reilly propose gratuitement son chapitre sur le modèle de décorateur ; Google a trouvé ce lien : PDF
Deux exemples concrets :
Les systèmes d'amélioration des objets dans Diablo 2 et Final Fantasy 7. Les armes et les armures ont des douilles ou des emplacements. Au cours du jeu, le joueur place des améliorations (gemmes, runes ou materia) dans ces emplacements. Chaque amélioration a un effet individuel (par exemple, 8 points de dégâts de feu ou 10% de sangsue de mana). Ainsi, lorsque vous balancez votre épée, elle inflige ses dégâts de base plus les dégâts ajoutés par chaque amélioration que vous avez ajoutée. Cela correspond très bien au modèle de décorateur.
Est-il mis en œuvre avec le modèle du décorateur ? Il semble qu'une liste de stratégies fonctionnerait tout aussi bien.
@JosiahYoder dans le modèle de stratégie, le comportement change au moment de l'exécution, seulement un à la fois, mais dans le modèle de décorateur, vous ajoutez un comportement supplémentaire au comportement existant.
@HameedSyed Les "slots" ou "upgrades" de Diablo ou Final Fantasy 7 agissent-ils comme des objets ? Le modèle de décorateur a également une relation "is-a" entre le décorateur et l'objet décoré. Quel est le décorateur ici ? Quel est l'objet décoré ?
Du Gang des Quatre :
Une boîte à outils d'interface utilisateur graphique, par exemple, devrait vous permettre d'ajouter des propriétés comme les bordures ou des comportements comme le défilement à n'importe quel composant d'interface utilisateur.
...
Le décorateur se conforme à l'interface du composant qu'il décore afin que sa présence soit transparente pour les clients du composant. Le décorateur transmet les demandes au composant et peut effectuer des actions supplémentaires (comme dessiner une bordure) avant ou après la transmission. La transparence permet d'imbriquer les décorateurs de manière récursive, ce qui autorise un nombre illimité de responsabilités supplémentaires.
Le but du modèle Decorator est de :
Attachez des responsabilités supplémentaires à un objet de manière dynamique. Les décorateurs offrent une alternative flexible à la sous-classification pour étendre les fonctionnalités. [via La tête la première : Modèles de conception ]
Les interfaces graphiques et les classes java.io sont celles qui utilisent le plus le motif décorateur. Il existe un chapitre gratuit de La tête la première : Modèles de conception sur le motif décorateur [PDF] qui fournissent d'autres exemples :
Nous réexaminerons la surutilisation typique de l'héritage et vous apprendrez comment décorer vos classes à l'exécution en utilisant une forme de composition d'objets. Pourquoi ? Une fois que vous connaîtrez les techniques de décoration, vous pourrez donner à vos objets (ou à ceux de quelqu'un d'autre) vos objets (ou ceux de quelqu'un d'autre) de nouvelles responsabilités sans faire de modifier le code des classes sous-jacentes sous-jacentes.
Vous pouvez également lire Modèle de décorateur par exemple [PDF] dans lequel le motif décorateur est utilisé dans une application d'évaluation.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Vous devez nous dire ce que vous devez faire si vous voulez savoir si un modèle de décorateur serait utile, si vous voulez juste un exemple général, il suffit de chercher Modèle de décorateur sur wikipedia.
0 votes
@BenRobinson J'ai lu l' Article de Wikipedia et je suis toujours à la recherche de meilleurs exemples.
0 votes
Duplicata possible de Quand utiliser le motif décorateur ?