Proxy (padrões de projeto)
Em programação de computadores, o padrão de proxy é um padrão de projeto de software. Um proxy (em português, "procurador"), em sua forma mais geral, é uma classe que funciona como uma interface para outra coisa. O proxy pode fazer interface com qualquer coisa: uma conexão de rede, um grande objeto na memória, um arquivo ou algum outro recurso caro ou impossível de duplicar. Resumindo, um proxy é um objeto wrapper (empacotador) ou agente que está sendo chamado pelo cliente para acessar o objeto de serviço real, nos bastidores. O uso do proxy pode simplesmente ser encaminhado para o objeto real ou pode fornecer lógica adicional. No proxy, funcionalidade extra pode ser fornecida, por exemplo, armazenamento em cache quando as operações no objeto real exigem muitos recursos ou verificação das pré-condições antes que as operações no objeto real sejam chamadas. Para o cliente, o uso de um objeto proxy é semelhante ao uso do objeto real, porque ambos implementam a mesma interface. Resumidamente, o padrão proxy possui três principais finalidades, sendo elas:
ProblemaVocê precisa implementar objetos que precisam de muitos recursos, mas você não quer instanciar tais objetos a menos/até que eles sejam requisitados pelo cliente. DiscussãoDesenvolver um substituto, ou proxy, objeto que: instancia o objeto real na primeira vez que o cliente faz uma solicitação de proxy, lembra a identidade desse objeto real, e então redireciona a requisição para o objeto real. Então todas as requisições subsequentes são simplesmente redirecionadas diretamente para o objeto real encapsulado. Essas são as quatro situações mais comuns em que o padrão Proxy é aplicável.
ExemplosEm JavaDefinindo a interface Subject, a presença do objeto Proxy estando no lugar do RealSubject é transparente ao cliente.
public interface Image{
void display();
}
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName){
this.fileName = fileName;
loadFromDisk(fileName);
}
@Override
public void display() {
System.out.println("Displaying " + fileName);
}
private void loadFromDisk(String fileName){
System.out.println("Loading " + fileName);
}
}
public class ProxyImage implements Image{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName){
this.fileName = fileName;
}
@Override
public void display() {
if(realImage == null){
realImage = new RealImage(fileName);
}
realImage.display();
}
}
public class ProxyPatternDemo {
public static void main(String args) {
Image image = new ProxyImage("test_10mb.jpg");
//image will be loaded from disk
image.display();
System.out.println("");
//image will not be loaded from disk
image.display();
}
}
Loading test_10mb.jpg Displaying test_10mb.jpg Displaying test_10mb.jpg |