web-dev-qa-db-fra.com

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?

45
coder

Ils vont généralement main dans la main. En ce sens, l'utilisation du motif composite conduit souvent à utiliser également le motif décoratif. 

Le modèle composite vous permet de créer une structure hiérarchique (telle qu'une arborescence d'éléments) de manière à ce que votre code externe puisse afficher l'intégralité de la structure en tant qu'entité unique. L’interface avec une entité feuille est donc exactement la même que celle d’une entité composée. L'essence est donc que tous les éléments de votre structure composite ont la même interface, même si certains sont des noeuds feuilles et d'autres des structures entières. Les interfaces utilisateur utilisent souvent cette approche pour permettre une composition facile.

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

Le motif de décorateur permet à une entité de contenir complètement une autre entité, de sorte que l'utilisation du décorateur est identique à l'entité contenue. Cela permet au décorateur de modifier le comportement et/ou le contenu de tout ce qu'il encapsule sans changer l'apparence extérieure de l'entité. Par exemple, vous pouvez utiliser un décorateur pour ajouter une sortie de journalisation sur l'utilisation de l'élément contenu sans modifier le comportement de l'élément contenu.

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

37
Phil Wright

La structure de composite pattern et de decorator est identique, mais leur intention est différente.

Composite donne une interface unifiée à une feuille et à un composite.

Décorateur décorateur donne une fonctionnalité supplémentaire à la feuille, tout en donnant une interface unifiée.


Exemples

Modèle composite : dossiers et fichiers classiques de Windows. Les dossiers Windows sont des composites. les fichiers sont des feuilles. Un double-clic sur l'un d'eux ouvre le fichier/dossier - le double-clic est une interface unifiée.

Modèle de décorateur : Buffered io - Java.io.FileWriter et Java.io.BufferedWriter étendent tous deux Java.io.Writer. Java.io.BufferedWriter est composite et FileWriter est feuille. BufferedWriter ajoute une responsabilité supplémentaire (ou fonctionnalité) de mise en mémoire tampon à FileWriter.write() méthode est une interface unifiée, tandis que la mise en mémoire tampon est une fonctionnalité supplémentaire.

36
Pavan

Un décorateur peut être considéré comme un composite dégénéré 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 que dit le groupe de quatre dans "Modèles de conception - Éléments de logiciels orientés objets réutilisables".

18
Ariel

La différence est probablement plus un objectif que la mise en œuvre. Dans certains cas, le motif composite est préférable au sous-classement. Par exemple, vous pouvez ajouter la fonctionnalité que vous souhaitez attribuer à une classe en y ajoutant des instances d'autres classes, puis en l'exposant via une interface de transfert.

Les décorateurs vous permettent d'ajouter de manière transparente des fonctionnalités, généralement une capacité unique, à une classe sans que les clients des instances de la classe aient besoin de savoir qu'il existe un décorateur - par exemple, un décorateur "login_nécessaire" sur une vue dans Django déclenche une exception si l'utilisateur n'est pas connecté, mais sinon, la vue se comporte comme sans le décorateur.

Dans les deux cas, vous avez un objet incorporé dans un autre, mais ce que vous essayez d'accomplir est sans doute différent.

5
Eric Walker

Différences de structure

Voici les diagrammes de classes du livre GoF, reproduits avec PlantUML.

GoF Decorator class diagram

GoF Composite class diagram

Différences d'intention

Le but de Decorator est de décorer un composant single (le diagramme UML doit en montrer une multiplicité pour le composant décoré), alors que le but de Composite est de regrouper les composants dans leur ensemble 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 ConcreteDecorators, alors que Composite vise à collecter des composants.

3
Fuhrmanator

Le motif Decorator peut être utilisé pour étendre (décorer) la fonctionnalité d'un objet donné de manière statique, ou dans certains cas au moment de l'exécution, indépendamment d'autres instances de la même classe.

C'est possible grâce à la composition: Decorator contient Component et implémente en même temps l'interface Component. 

Le modèle Composite indique qu'un groupe d'objets doit être traité de la même manière qu'une instance unique d'un objet. Le but d'un composite est de "composer" des objets dans des arborescences pour représenter des hiérarchies entières.

L'implémentation du motif composite permet aux clients de traiter des objets et compositions individuels de manière uniforme.

Même si la structure semble être la même, les cas d'intention et d'utilisation sont différents. 

Cas d'utilisation pour Décorateur modèle:

  1. Les responsabilités et les comportements des objets doivent être ajoutés/supprimés dynamiquement
  2. Les implémentations concrètes doivent être découplées des responsabilités et des comportements
  3. le sous-classement est trop coûteux pour ajouter/supprimer des responsabilités de manière dynamique

Key différences entre ces deux modèles:

  1. Decorator est conçu pour vous permettre d’ajouter des responsabilités aux objets sans sous-classement. L'accent mis par Composite n'est pas sur l'embellissement mais sur la représentation
  2. Decorator ajoute/supprime des responsabilités supplémentaires - il n'est pas destiné à l'agrégation d'objets.

Postes utiles dans SE pour une meilleure compréhension:

Motif de décorateur pour IO

Quand utiliser le motif de décorateur?

1
Ravindra babu

Composite:

  • Est une structure arborescente utilisant la récursivité.
  • Leaf et Composite ont la même interface
  • Unité entre objets

Décorateur:

  • Est contenir une autre entité.
  • Ajouter de nouvelles fonctionnalités à un objet composite sans le modifier.
0
Premraj