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 completo

Decorator

As responsabilidades extras são opcionais, combináveis e decididas em tempo de execução.

Ver o conceito completo

Por 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.