Proxy (padrões de projeto)
Em programação, o padrão proxy é um padrão de projeto de software.
Um proxy, em sua forma mais geral, é uma classe que funciona como uma interface para outra classe. A classe proxy poderia conectar-se a qualquer coisa: uma conexão de rede, um objeto grande em memória, um arquivo, ou algum recurso que é difícil ou impossível de ser duplicado.
Um exemplo bem conhecido do padrão proxy é um objeto ponteiro de referência de contagem.
Em situações onde múltiplas cópias de um objeto complexo deve existir o padrão proxy pode ser adaptado para incorporar o padrão flyweight a fim de reduzir o rastro de memória das aplicações. Normalmente uma instância de um objeto complexo é criada e vários objetos proxies são criados, todos contendo uma referência ao único objeto complexo original. Quaisquer operações realizadas nos proxies são enviadas ao objeto original. Uma vez que todas as instâncias do proxy estiverem fora do escopo, a memória do objeto complexo pode ser desalocada.
Exemplo [editar]
O seguinte exemplo em Java ilustra o padrão "proxy virtual". A classe ImagemProxy é utilizada para acessar um método remoto.
import java.util.*; interface Imagem { public void mostrarImagem(); } // no Sistema A class ImagemReal implements Imagem { private String nomeDoArquivo; public ImagemReal(String nomeDoArquivo) { this.nomeDoArquivo = nomeDoArquivo; carregarImagemDoDisco(); } private void carregarImagemDoDisco() { System.out.println("Carregando " + nomeDoArquivo); } public void mostrarImagem() { System.out.println("Mostrando " + nomeDoArquivo); } } // no Sistema B class ImagemProxy implements Imagem { private String nomeDoArquivo; private Imagem imagem; public ImagemProxy(String nomeDoArquivo) { this.nomeDoArquivo = nomeDoArquivo; } public void mostrarImagem() { imagem = new ImagemReal(nomeDoArquivo); imagem.mostrarImagem(); } } class ExemploProxy { public static void main(String[] args) { Imagem imagem1 = new ImagemProxy("ResOi_10MB_Foto1"); Imagem imagem2 = new ImagemProxy("ResOi_10MB_Foto2"); imagem1.mostrarImagem(); // necessário o carregamento imagem2.mostrarImagem(); // necessário o carregamento } }
A saída do programa é:
Carregando ResOi_10MB_Foto1 Mostrando ResOi_10MB_Foto1 Carregando ResOi_10MB_Foto2 Mostrando ResOi_10MB_Foto2