34 votes

Quand avons-nous besoin du motif décorateur ?

Quand devons-nous opter pour le modèle du décorateur ? Si possible, donnez-moi un exemple concret qui correspond à ce modèle...

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

53voto

Noel M Points 6263

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 :

  • Lecture et écriture sur disque (ci-dessus)
  • Construction d'éléments d'interface utilisateur, comme l'ajout de barres de défilement dans les zones de texte, etc.

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

5 votes

Oui, java.io est entièrement consacré aux décorateurs.

1 votes

+1 Bien que je ne considère pas l'utilisation intensive du modèle Decorator dans java.io comme "belle". C'est l'une des nombreuses raisons pour lesquelles le fichier io en Java est une telle douleur dans l'a**.

24voto

user240515 Points 1282

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.

0 votes

Est-il mis en œuvre avec le modèle du décorateur ? Il semble qu'une liste de stratégies fonctionnerait tout aussi bien.

0 votes

@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.

0 votes

@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é ?

8voto

Mike Points 6184

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.

3 votes

Les interfaces utilisateur du monde réel utilisent-elles ce type de décorateur ?

5voto

Lazarus Points 17526

Jetez un coup d'œil à la description de Fowler ; elle donne un exemple concret concernant les livres/vidéos et un décorateur "empruntable", vous pouvez la trouver aquí .

3voto

Dariusz Woźniak Points 2571

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.

0 votes

Le lien PDF de Head First est 404.

0 votes

@james.garriss : fixe

Prograide.com

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.

Powered by:

X