Obrigado por visitar a devmedia.com.br!

Precisamos de você para divulgar nossos vídeos e cursos gratuitos para a comunidade.

Se você gosta da devmedia.com.br por favor dê-nos o seu clique para o Google+ e ajude outros desenvolvedores ao redor do mundo.



Obrigado por seu apoio!
Equipe DevMedia

sair sem compartilhar (x)
DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:

Pattern Proxy

O Pattern Proxy é um pattern Estrutural definido pelo Gof (Gang of Four). O seu objetivo principal é encapsular um objeto através de um outro objeto que possui a mesma interface..

 

O Pattern Proxy é um pattern Estrutural definido pelo Gof (Gang of Four). O seu objetivo principal é encapsular um objeto através de um outro objeto que possui a mesma interface, de forma que o segundo objeto, conhecido como “Proxy”, controla o acesso ao primeiro, que é o objeto real.

Vantagens do Pattern Proxy

As principais vantagens de se utilizar o pattern Proxy são:

 

1.      Permite deixar transparente o local (endereço) do objeto real. O cliente não precisa conhecer se o objeto é remoto ou não, este tipo de proxy é conhecido como Remote Proxy.

 

O pattern Proxy é muito utilizado pela tecnologia J2EE, pelo objeto “javax.ejb.EJBObject”, que representa uma referência remota ao EJB. Para o cliente que está utilizando a interface remote de um EJB, é transparente a chamada remota ao servidor, permitindo que complexos sistemas distribuídos possam ser desenvolvidos como se fossem chamadas locais.

 

O consagrado framework Hibernate também utiliza o pattern Proxy, por exemplo ao fazer o “lazy-loading”, técnica utilizado para acessar o banco de dados apenas quando for necessário. Muitas vezes quando trabalhamos com o Hibernate, e uma busca é realizada, por exemplo usando o método “session.load(id)”, um Proxy para o objeto real é retornado. Neste caso o objeto ainda não está completamente preenchido,  pois nenhum SQL foi realizado até este momento. Apenas quando uma propriedade deste objeto (métodos getX) ou um relacionamento, como por exemplo “empresa.getFuncionarios()” forem chamados, a consulta no banco será realizada. Tudo isto de forma transparente para o cliente.

 

2.      Útil para realizar otimizações, como cache de objetos. Também pode ser implementado rotinas de logs e controle de acesso (segurança). Este tipo de proxy é conhecido como Virtual Proxy.

 

Uma vez que neste padrão o objeto real é encapsulado, o objeto Proxy pode armazenar o resultado de um acesso em cache. Por exemplo, se um Remote Proxy é utilizado, o custo deste acesso remoto pode ser grande para a aplicação, neste caso o Proxy salva localmente os resultados em cache, diminuindo assim, a quantidade de acessos remotos.

Diagrama

Abaixo o diagrama do pattern Proxy:

 

patproxyfig01.JPG

 

O diagrama demonstra que o objeto Proxy e o objeto real (RealSubject) implementam a mesma interface, neste caso chamada de Subject. O Proxy encapsula o acesso ao RealSubject.

Exemplo de Código

Abaixo um exemplo de código. Crie uma classe “ProxyExamplee execute o código:

 

import java.util.ArrayList;

import java.util.List;

 

/**

 * Imagine que esta classe faz acessos ao banco de dados

 */

class PessoaDAO {

      public static Pessoa getPessoaByID(String id){

            System.out.println("select * from PESSOA where id="+id);

            return new PessoaImpl(id,"Pessoa " + id);

      }

}

 

/**

 * Interface comum entre o objeto real e o Proxy

 */

interface Pessoa {

      public String getNome();

      public String getId();

}

 

/**

 * Objeto real

 */

class PessoaImpl implements Pessoa {

      private String nome;

      private String id;

 

      public PessoaImpl(String id,String nome) {

            this.id       = id;

            this.nome = nome;

            // apenas para simular algo...

            System.out.println("Retornou a pessoa do banco de dados ->  " + nome);

      }

 

      public String getNome() {

            return nome;

      }

      public String getId() {

            return this.id;

      }

}

 

class ProxyPessoa implements Pessoa {

      private String id;

 

      private Pessoa pessoa;//mesma interface

 

      public ProxyPessoa(String nome) {

            this.id = nome;

      }

 

      /**

       * Método comum da interface

       *

       * @see Pessoa#getNome()

       */

      public String getNome() {

            if (pessoa == null) {

                  //Apenas cria o objeto real quando chamar este método

                  pessoa = PessoaDAO.getPessoaByID(this.id);

            }

            /** Delega para o objeto real **/

            return pessoa.getNome();

      }

 

      public String getId() {

            return this.id;

      }

}

 

/**

 * Exemplo adaptado de "http://en.wikipedia.org/wiki/Proxy_pattern"

 */

public class ProxyExample {

      public static void main(String[] args) {

            List<Pessoa> pessoas = new ArrayList<Pessoa>();

           

      //Cria cada Proxy para encapsular o acesso a classe "PessoaImpl"

            pessoas.add(new ProxyPessoa("A"));

            pessoas.add(new ProxyPessoa("B"));

            pessoas.add(new ProxyPessoa("C"));

 

            System.out.println("Nome: " + pessoas.get(0).getNome()); // busca do banco de dados

            System.out.println("Nome: " + pessoas.get(1).getNome()); // busca do banco de dados

            System.out.println("Nome: " + pessoas.get(0).getNome()); // já buscou esta pessoa... apenas retorna do cache...

 

            // A terceira pessoa nunca será consultada no banco de dados (melhor performance - lazy loading)

            System.out.println("Id da 3ª - " + pessoas.get(2).getId());//pode imprimir o ID do objeto, e o proxy nao será inicializado.

      }

}

 

Abaixo a saída do programa:

 

select * from PESSOA where id=A

Retornou a pessoa do banco de dados ->  Pessoa A

Nome: Pessoa A

select * from PESSOA where id=B

Retornou a pessoa do banco de dados ->  Pessoa B

Nome: Pessoa B

Nome: Pessoa A

Id da 3ª – C

 

Conforme demonstrado no exemplo, uma consulta no banco de dados é realizada apenas quando o método “getNome” da Pessoa é chamado. O Proxy controla este acesso, controlando a consulta para esta ser realizada apenas uma vez.

 

Note que o método “pessoas.get(2).getId()” foi chamado para imprimir o ID da “Pessoa C”, e isto não inicializou o proxy.

 

Þ      Lembre-se: o importante é que o Proxy e o objeto real que está sendo encapsulado devem implementar a mesma interface.

Conclusão

O Pattern Proxy é muito utilizado em aplicações J2EE e por alguns frameworks, espero que tenham gostado deste breve artigo, e até a próxima.

Referências

Þ      http://jakarta.apache.org/commons/sandbox/proxy/

 

Þ      http://en.wikipedia.org/wiki/Proxy_pattern

 

Þ      Gang of Four: Design Patterns, Eric Gamma, Richard Helm, Ralph Johnson, John Vlissides
http://www.amazon.com/exec/obidos/tg/detail/-/0201633612/qid=1125413337/sr=1-1/ref=sr_1_1/104-0714405-6441551?v=glance&s=books

 

Þ      http://www.martinfowler.com/articles/writingPatterns.html





    3 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Alexandre M.
Muito interessante esse artigo... É o que estava faltando nesse site; artigos sobre design pattern. A explicação e o exemplo estão de parabens.


em 22/12/2006 08:52 - Responder

 

Andre Souza
artigo muito bem escrevito, está de parabens.


em 4/1/2007 15:18 - Responder

 

  Alain John
Nós que estamos aprendendo sentimos falta das vídeo aulas e uma sugestão é sobre calculos de aplicações financeiras, exemplo: Calculo de ICMS, e outros impostos que precisamos saber em aplicações de Automação Comercial e Fiscal. No mais parabéns pela ed. 79 e que este ano seja de susseço e que a DevMedia continui a crescer e compartilhar de seus conhecimentos, obrigado aos editores, aos colunistas em especial para Luciano Pimenta, Everson Volaco, Jefferson Junglaus e ao Guinther Pauli.


em 4/1/2007 16:06 - Responder
 



[Este post ainda não foi associado a uma sequência]
Autor
Ricardo Rodrigues Lecheta

Ricardo Rodrigues Lecheta (ricardolecheta@terra.com.br), é autor do livro “Google Android” - Aprenda a criar aplicações para dispositivos móveis utilizando o Android SDK e possui as certificações SCJP, SCWCD, SCBCD, SCMAD, SCEA.


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
0   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]
Este post está disponível para assinantes da Java Magazine ou para quem possui Créditos DevMedia.

  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 0,00 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ -1,00 (assinante) ou R$ -1,00 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ -1,00
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03