Difference between the Composite Pattern and Decorator Pattern?

36,546

Solution 1

They usually go hand in and hand. In that using the composite pattern often leads to also using the decorator pattern.

The composite pattern allows you to build a hierarchical structure (such as a tree of elements) in a way that allows your external code to view the entire structure as a single entity. So the interface to a leaf entity is exactly the same as the entity for a compound entity. So the essence is that all elements in your composite structure have the same interface even though some are leaf nodes and others are entire structures. User interfaces often use this approach to allow easy composability.

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

The decorator pattern allows an entity to completely contain another entity so that using the decorator looks identical to the contained entity. This allows the decorator to modify the behaviour and/or content of whatever it is encapsulating without changing the outward appearance of the entity. For example, you might use a decorator to add logging output on the usage of the contained element without changing any behaviour of the contained element.

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

Solution 2

The structure of composite pattern and decorator look the same but they have different intent.

Composite gives an unified interface to a leaf and composite.

Decorator decorator gives additional feature to leaf, while giving unified interface.


Examples

Composite pattern: classic windows folders and files. Windows folders are composites. files are leaves. A double click on either of them opens the file/folder - double click is unified interface.

Decorator pattern: Buffered io - java.io.FileWriter and java.io.BufferedWriter both extend java.io.Writer. java.io.BufferedWriter is composite and FileWriter is leaf. BufferedWriter adds additional responsibility (or feature) of buffering to FileWriter. write() method is unified interface, whereas buffering is additional feature.

Solution 3

A decorator can be viewed as a degenerate composite with only one component. However, a decorator adds additional responsibilities—it isn't intended for object aggregation.

This is what is said in "Design Patterns-Elements of Reusable Object Oriented Software" by the gang of four.

Solution 4

The difference is probably more one of purpose than implementation. In some instances the composite pattern is preferable to subclassing. For example, you can add the functionality that you want a class to have by adding instances of other classes to it and then exposing the functionality through a forwarding interface.

Decorators allow you to transparently add functionality, usually a single capability, to an class without clients of the instances of the class needing to know the that there's a decorator there - for example, a "login_required" decorator on a view in Django raises an exception if the user isn't logged in, but otherwise the view behaves as it would without the decorator.

In both cases you have one object embedded within another, but what you're trying to accomplish is arguably different.

Solution 5

Differences in structure

Here are the class diagrams from the GoF book, reproduced using PlantUML.

GoF Decorator class diagram

GoF Composite class diagram

Differences in intent

The intent of Decorator is to decorate a single component (the UML diagram really should show a multiplicity of one for the decorated component), whereas the intent of Composite is to group Components as a whole in the Composite (again, the UML should show a Composite containing one or more Components).

Decorator has a goal to add behavior (enhance behavior of the Operation() method) via the ConcreteDecorators, whereas Composite aims to collect Components.

Share:
36,546
coder
Author by

coder

Updated on January 28, 2020

Comments

  • coder
    coder over 4 years

    What is the difference between the Composite Pattern and Decorator Pattern?

  • Łukasz Rzeszotarski
    Łukasz Rzeszotarski almost 11 years
    for me the most interesting from this answer is that you wrote ('they usually go hand in hand. In that using the composite pattern often lead to also using the decorator patter') in gof book you can see that dependency between Composite and Decorator. Composite can use Decorator for adding responsibilities to objects (it is on the diagram with dependencies between patterns). Could you provide an example of implementation for it (or class diagram). Because I am not sure what the author of gof has in mind exactly.
  • Kidus Tekeste
    Kidus Tekeste almost 3 years
    The keyword unified interface is a powerful phrase which goes better with Facade DP than Composite and Decorator. Keyword are powerful, they might be misleading if not used appropriately.