Différence entre le motif Composite et le motif décorateur?

Quelle est la différence entre le motif Composite et le motif décorateur?

40
demandé sur Aditya W 2010-02-10 05:08:04

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.

http://en.wikipedia.org/wiki/Decorator_pattern

33
répondu Phil Wright 2013-03-05 05:36:35

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.

32
répondu Pavan 2015-12-01 23:37:17

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.

18
répondu Ariel 2015-12-01 23:47:52

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.

5
répondu Eric Walker 2010-02-10 02:29:12

différences de structure

Voici les diagrammes de classe du Livre de GoF, reproduits à L'aide de PlantUML.

GoF Decorator class diagram

GoF Composite class diagram

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.

3
répondu Fuhrmanator 2017-02-08 15:07:27

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:

  1. les responsabilités et les comportements liés aux objets devraient être ajoutés/supprimés de façon dynamique
  2. les mises en œuvre concrètes devraient être découplées des responsabilités et des comportements
  3. le sous-classement est trop coûteux pour ajouter ou supprimer dynamiquement des responsabilités

Clé différences entre ces deux modèles:

  1. 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
  2. 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 :

motif décorateur pour IO

quand utiliser le motif décorateur?

1
répondu Ravindra babu 2017-09-24 20:31:47

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.
0
répondu Premraj 2018-01-27 14:39:49