Différence entre le motif Composite et le motif décorateur?
7 réponses
ils vont habituellement main dans la main. En ce que l'utilisation du modèle composite conduit souvent à utiliser également le modèle décorateur.
Le composite modèle permet de construire une structure hiérarchique (comme un arbre d'éléments) d'une manière qui permet à votre code externe pour afficher l'ensemble de la structure en tant qu'entité unique. Donc l'interface avec une entité foliaire est exactement la même que l'entité pour une entité composée. Donc l'essence est que tous les éléments dans votre composite structure ont la même interface même si certains sont des noeuds de feuille et d'autres sont des structures entières. Les interfaces utilisateurs utilisent souvent cette approche pour permettre une composabilité facile.
http://en.wikipedia.org/wiki/Composite_pattern
le motif décorateur permet à une entité de contenir complètement une autre entité de sorte que l'utilisation du décorateur semble identique à l'entité contenue. Cela permet au Décorateur de modifier le comportement et / ou contenu de ce qui est encapsulé sans changer l'apparence extérieure de l'entité. Par exemple, vous pouvez utiliser un décorateur d'ajouter de sortie d'enregistrement sur l'utilisation de l'élément contenu, sans modification du comportement de l'élément contenu.
La structure de composite et décorateur regardez le même, mais ils ont l'intention différente.
Composite donne une interface unifiée à une feuille et composite.
Decorator decorator donne caractéristique supplémentaire à la feuille, tout en donnant interface unifiée.
exemples
Composite modèle : classique dossiers et les fichiers windows. Les dossiers Windows sont des composites. les fichiers sont des feuilles. Un double clic sur l'un d'eux ouvre le fichier/dossier - double-cliquez est interface unifiée.
Décorateur modèle : mise en mémoire Tampon io - java.io.FileWriter
et java.io.BufferedWriter
à la fois d'étendre java.io.Writer
. java.io.BufferedWriter
est composite et FileWriter
est foliaire. BufferedWriter
ajoute une responsabilité supplémentaire (ou caractéristique) du tampon à FileWriter
.
La méthode write()
est une interface unifiée, tandis que la mise en tampon est une caractéristique supplémentaire.
Un décorateur peut être considéré comme un dégénéré, composite avec un seul composant. Cependant, un décorateur ajoute des responsabilités supplémentaires-il n'est pas destiné à l'agrégation d'objets.
C'est ce qui est dit dans "Design Patterns-les Éléments de l'Objet Réutilisable de Logiciels Orientés" par la bande des quatre.
la différence est probablement plus une question de but que de mise en œuvre. Dans certains cas, le schéma composite est préférable au sous-classement. Par exemple, vous pouvez ajouter la fonctionnalité que vous voulez qu'une classe ait en y ajoutant des instances d'autres classes et en exposant ensuite la fonctionnalité via une interface de redirection.
décorateurs vous permettent d'ajouter de manière transparente la fonctionnalité, généralement une seule capacité, à une classe sans les clients des instances de la classe qui a besoin de savoir qu'il y a un décorateur là - bas-par exemple, un décorateur "login_required" sur une vue dans Django soulève une exception si l'utilisateur n'est pas connecté, mais autrement la vue se comporte comme elle le ferait sans le décorateur.
dans les deux cas, vous avez un objet intégré dans un autre, mais ce que vous essayez d'accomplir est sans doute différent.
différences de structure
Voici les diagrammes de classe du Livre de GoF, reproduits à L'aide de PlantUML.
différences d'intention
L'intention du décorateur est de décorer un composant simple (le diagramme UML devrait vraiment montrer une multiplicité d'un pour le composant décoré), alors que L'intention du Composite est de grouper les composants dans leur ensemble dans le Composite (encore une fois, le code UML doit montrer un Composite contenant un ou plusieurs composants).
Decorator a pour objectif d'ajouter un comportement (améliorer le comportement de la méthode Operation()
) via les Decorateurs concrets, tandis que Composite vise à collecter des composants.
le Decorator pattern peut être utilisé pour étendre (décorer) la fonctionnalité d'un certain objet statiquement, ou dans certains cas à l'exécution, indépendamment d'autres instances de la même classe.
c'est possible grâce à la composition : Decorator contient le composant et en même temps il implémente l'interface du composant.
le motif Composite décrit qu'un groupe d'objets doit être traité de la même façon qu'une seule instance d'un objet. Le but d'un composite est de "composer" des objets en structures arborescentes pour représenter une partie de hiérarchies entières.
la mise en œuvre du modèle composite permet aux clients de traiter les objets individuels et les compositions de manière uniforme.
même si la structure semble être la même, les cas d'intention et d'utilisation sont différents.
utiliser des étuis pour décorateur motif:
- les responsabilités et les comportements liés aux objets devraient être ajoutés/supprimés de façon dynamique
- les mises en œuvre concrètes devraient être découplées des responsabilités et des comportements
- le sous-classement est trop coûteux pour ajouter ou supprimer dynamiquement des responsabilités
Clé différences entre ces deux modèles:
- Décorateur est conçu pour vous permettre d'ajouter des responsabilités à des objets sans sous-classement. Composite ne se concentre pas sur l'embellissement mais sur la représentation
- décorateur ajoute / supprime des responsabilités supplémentaires - il n'est pas destiné à l'agrégation d'objets.
Utile postes dans SE pour mieux comprendre :
Composite:
- est une structure arborescente utilisant la récursion.
- feuille et Composite ont la même interface
- unité entre objets
Décorateur:
- contient une autre entité.
- ajouter une nouvelle fonctionnalité à un objet composite sans le modifier.