Proxy × Decorator
Dois padrões que costumam ser trocados um pelo outro, e o que de fato os separa.
Em uma frase
Os dois embrulham um objeto mantendo a interface. O Decorator acrescenta comportamento que o cliente pediu; o Proxy controla se a chamada chega ao destino, e o cliente costuma nem saber que ele existe.
Critério a critério
Qual é a intenção?
- Proxy
- Controlar o acesso: adiar a criação, cachear, exigir permissão, cruzar a rede.
- Decorator
- Somar comportamento ao resultado: log, retry, compressão, formatação.
Quem monta a pilha?
- Proxy
- Normalmente ninguém — o proxy é injetado no lugar do real, invisível.
- Decorator
- O cliente, deliberadamente, escolhendo a ordem das camadas.
Quantas camadas?
- Proxy
- Uma. Empilhar proxies é raro e costuma indicar modelagem confusa.
- Decorator
- Várias, empilháveis em qualquer ordem — é o ponto do padrão.
O resultado muda?
- Proxy
- Não. Mesma resposta, obtida de forma mais barata ou mais segura.
- Decorator
- Sim. Cada camada agrega algo visível ao que volta.
Quem decide se a chamada acontece?
- Proxy
- O proxy pode barrar, adiar ou responder do cache sem tocar o real.
- Decorator
- O decorator sempre delega — interromper não é sua função.
Quando escolher cada um
Proxy
O objeto é caro, sensível ou remoto, e você quer que isso seja invisível para quem chama.
Ver o conceito completoDecorator
As responsabilidades extras são opcionais, combináveis e decididas em tempo de execução.
Ver o conceito completoPor que confundem
Como o desenho é idêntico — mesma interface, referência ao interno, delegação —, muita gente escolhe pelo formato. A pergunta que resolve não é 'como está construído?', é 'estou controlando o acesso ou enriquecendo o comportamento?'. Chamar tudo de proxy faz o nome perder o poder de comunicar intenção.