Proxy (padrões de projeto)

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa

Em programação, o padrão proxy é um padrão de projeto de software classificado como padrão estrutural aplicado a objetos. Sua principal intenção é fornecer um substituto (surrogate) ou marcador da localização de outro objeto para controlar o acesso a esse objeto.

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 em que 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.

Embora o Proxy possa ter uma implementação semelhante a um padrão Decorator, suas finalidades são diferentes. Um objeto decorador acrescenta uma ou mais responsabilidades a um objeto, enquanto que um proxy controla o acesso a um objeto. No padrão Proxy, o objeto fornece as funcionalidades-chave e o proxy fornece (ou recusa) acesso ao objeto. No Decorator, o componente fornece somente parte da funcionalidade e um ou mais decoradores fornecem o restante. O Decorator trata a situação em que a funcionalidade total de um objeto não pode ser determinada em tempo de compilação, pelo menos não de maneira conveniente. Essa abertura torna a composição recursiva uma parte essencial do Decorator. Esse não é o caso do Proxy porque o Proxy focaliza um relacionamento – entre o proxy e seu objeto– e esse relacionamento pode ser expresso estaticamente.

Exemplo[editar | editar código-fonte]

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() {
        if(imagem == null)
          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
        imagem1.mostrarImagem(); // não é necessário o carregamento
        imagem2.mostrarImagem(); // é necessário o carregamento
        imagem2.mostrarImagem(); // não é necessário o carregamento
        imagem2.mostrarImagem(); // não é necessário o carregamento
        imagem1.mostrarImagem(); // não é necessário o carregamento
    }
}

A saída do programa é:

Carregando    ResOi_10MB_Foto1
Mostrando     ResOi_10MB_Foto1
Mostrando     ResOi_10MB_Foto1
Carregando    ResOi_10MB_Foto2
Mostrando     ResOi_10MB_Foto2
Mostrando     ResOi_10MB_Foto2
Mostrando     ResOi_10MB_Foto2
Mostrando     ResOi_10MB_Foto1

Ver também[editar | editar código-fonte]

Ícone de esboço Este artigo sobre Internet é um esboço relacionado ao Projeto Internet. Você pode ajudar a Wikipédia expandindo-o.