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 completoDecorator
Você quer somar responsabilidades opcionais a um objeto, combináveis em runtime.
Ver o conceito completoPor 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.