Composite × Decorator

Dois padrões que costumam ser trocados um pelo outro, e o que de fato os separa.

Em uma frase

Os dois compõem objetos da mesma interface recursivamente. O Composite agrupa N filhos para representar uma hierarquia; o Decorator embrulha um objeto para acrescentar comportamento.

Critério a critério

  • Quantos objetos contidos?

    Composite
    Vários — é uma árvore parte-todo.
    Decorator
    Exatamente um — é uma casca sobre outra casca.
  • O que a estrutura representa?

    Composite
    Os dados: pastas dentro de pastas, itens dentro de grupos.
    Decorator
    O comportamento: camadas de responsabilidade sobre o mesmo objeto.
  • O que a operação faz nos filhos?

    Composite
    Agrega: soma, concatena, escolhe o máximo.
    Decorator
    Delega e complementa: faz o extra e repassa.

Quando escolher cada um

Composite

A estrutura é uma hierarquia de profundidade variável e o cliente deve tratar item e grupo igual.

Ver o conceito completo

Decorator

Você quer somar responsabilidades opcionais a um objeto, combináveis em runtime.

Ver o conceito completo

Por que confundem

O código se parece muito — interface comum, referência ao interno, recursão. A diferença é o que você está modelando: se remover uma camada muda o que existe, é Composite; se muda o que acontece, é Decorator.