Quando um objeto é caro, remoto ou sensível, o cliente nem sempre deveria acessá-lo diretamente.
O padrão Proxy resolve isso oferecendo um substituto com a mesma interface do objeto real.
Imagine um sistema acadêmico que consulta um serviço remoto para gerar relatórios detalhados de alunos.
Sem intermediação, o cliente pode repetir chamadas caras, instanciar serviços pesados cedo demais e espalhar verificações de acesso.
interface RelatorioService { String gerarRelatorio(int alunoId); } class RelatorioRemotoService implements RelatorioService { public String gerarRelatorio(int alunoId) { System.out.println("Consultando servidor remoto..."); return "Relatorio completo do aluno " + alunoId; } }
class RelatorioProxy implements RelatorioService { private RelatorioService service; private String cache; private Integer ultimoAlunoId; public String gerarRelatorio(int alunoId) { if (cache != null && ultimoAlunoId != null && ultimoAlunoId.equals(alunoId)) { return cache; } if (service == null) { service = new RelatorioRemotoService(); } cache = service.gerarRelatorio(alunoId); ultimoAlunoId = alunoId; return cache; } }