🛡️ O que é?

No contexto de design de software, o Proxy é um padrão de projeto estrutural que atua como um intermediário entre o cliente e o objeto real. Ele intercepta chamadas tanto de requisições (requests) quanto de respostas (responses), podendo adicionar comportamentos adicionais antes ou depois da execução da lógica principal.

⚠️ Importante: Aqui estamos falando do Proxy como padrão de projeto, e não de proxies físicos de rede ou intermediadores HTTP.

Imagem demonstracao uso proxy


🧩 Para que usar?

O Proxy pode ser utilizado para diversos propósitos, como:

  • ✅ Aplicar regras e validações antes da chamada real
  • 📝 Gerar logs ou métricas
  • 🔐 Implementar segurança e controle de acesso
  • 🚀 Adicionar cache
  • 🧪 Criar simulações ou objetos "mockados"

Além disso, ele ajuda a manter seu código aderente ao princípio Open/Closed do SOLID, ou seja:

"Aberto para extensão, mas fechado para modificação"

Você estende comportamentos sem precisar alterar a lógica original da classe-alvo.


💡 Exemplo:

Vamos supor que você receba uma atividade de adicionar uma nova validação ao sistema, mas não pode violar o princípio OCP (Open/Closed Principle) — que diz que uma classe deve ser aberta para extensão, mas fechada para modificação.

Nesse caso, o padrão de projeto Proxy pode ser uma ótima solução:

// Interface comum
public interface Servico {
    void executar();
}

// Proxy que adiciona lógica extra antes/depois da execução
public class ServicoProxy implements Servico {
    private final Servico servicoReal;

    public ServicoProxy(Servico servicoReal) {
        this.servicoReal = servicoReal;
    }

    @Override
    public void executar() {
        System.out.println("FAZENDO A NOVA VALIDACAO INICIAL");
        servicoReal.executar();
        System.out.println("FAZENDO A NOVA VALIDACAO DEPOIS DA EXECUCAO");
    }
}

// Implementação real do serviço
public class ServicoReal implements Servico {
    @Override
    public void executar() {
        System.out.println("REGRA JA EXISTENTE");
    }
}

Veja que a regra funcional já existente não foi alterada somente foi adicionado um novo comportamento na camada anterior.