Proxy (padrões de projeto)

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa
Ambox rewrite.svg
Esta página precisa ser reciclada de acordo com o livro de estilo (desde outubro de 2016).
Sinta-se livre para editá-la para que esta possa atingir um nível de qualidade superior.
Question book.svg
Esta página ou secção não cita fontes confiáveis e independentes, o que compromete sua credibilidade (desde outubro de 2016). Por favor, adicione referências e insira-as corretamente no texto ou no rodapé. Conteúdo sem fontes poderá ser removido.
Encontre fontes: Google (notícias, livros e acadêmico)
Emblem-question.svg
Este artigo ou se(c)ção pode conter texto de natureza não enciclopédica. (desde outubro de 2016)
Justifique o uso dessa marcação e tente resolver essas questões na página de discussão.

O Padrão de Projeto Proxy possui três principais finalidades, sendo elas:

  • Prover um substituto ou placeholder para um outro objeto controlar seu acesso.
  • Usar um nível extra de indireção para fornecer acesso distribuído, controlado ou inteligente.
  • Adicionar um agregador e delegador para proteger o componente real de complexidade indevida.

Problema[editar | editar código-fonte]

Você 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ão[editar | editar código-fonte]

Desenvolver 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.

  • Um proxy virtual é um placeholder para objetos "caros de se criar". O objetivo real é apenas criado quando um cliente primeiramente requere/acessa o objeto.
  • Um proxy remoto provê um representativo local para um objeto que reside em um espaço de endereço diferente. Isso é o que "stub" código em RPC e CORBA provê.
  • Um proxy protetor controla o acesso a um objeto mestre sensível. O objeto "substituto" verifica se o "caller" tem as permissões requisitadas para o redirecionamento da requisição.
  • Um proxy inteligente interpõe ações adicionais quando um objeto é acessado. Usos típicos incluem:
  1. Contar o número de referências ao objeto real para que seja libertado automaticamente assim que não houver mais referências.
  2. Carregar um objeto persistente na memória quando for referenciado pela primeira vez.
  3. Verificar se o objeto real está travado antes de ser acessado para assegurar que nenhum outro objeto possa mudá-lo.

Estrutura[editar | editar código-fonte]

Definindo a interface Subject, a presença do objeto Proxy estando no lugar do RealSubject é transparente ao cliente.

Proxy

Em Java[editar | editar código-fonte]

Image[editar | editar código-fonte]

public interface Image {

     void display();
  }

Real Image[editar | editar código-fonte]

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);
    }
  }

Proxy Image[editar | editar código-fonte]

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();
   }
  }

Proxy Pattern[editar | editar código-fonte]

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();
    }
  }

Output[editar | editar código-fonte]

Loading test_10mb.jpg

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