Proxy Projeto de Sistemas de Software Roberta Claudino Barreto Pessanha Gomes Proxy • Propósito – Prover um representante para outro objeto de modo a controlar o acesso ao mesmo © LES/PUC-Rio 2 Proxy • Motivação – Controlar acesso a um objeto • delegar o custo de criação e inicalização para o momento de uso (objetos sob demanda) • prover um representante local para um objeto remoto • proteger o objeto original – Ex.: Acesso a uma Imagem © LES/PUC-Rio 3 Proxy • Aplicabilidade – Usado sempre que se precisa de uma referência a um objeto (mais versátil ou sofisticada do que um simples ponteiro) – Principais situações: • Remote Proxy: provê um representante local para um objeto em um espaço de endereçamento diferente • Virtual Proxy: cria objeto sob demanda • Protection Proxy: controla acesso ao objeto original • Smart References: executa operações adicionais quando o objeto é acessado (contagem de referências, carga de objetos persistentes, locks) • Copy-on-write: compartilhar grandes objetos, fazendo uma cópia apenas se necessário © LES/PUC-Rio 4 Proxy • Estrutura © LES/PUC-Rio 5 Proxy - Participantes • Subject – define uma interface comum para que um Proxy e um RealSubject sejam intercambiáveis • Proxy – mantém uma referência para acessar o RealSubject – provê uma interface idêntica ao Subject para permitir que substitua o RealSubject – controla o acesso ao RealSubject (depende do tipo de Proxy) • RealSubject – objeto real que o proxy representa © LES/PUC-Rio 6 Proxy – Colaborações e Conseqüências • Introduz um nível de indireção para acessar o objeto – esconde a localização do objeto real – executa otimizações como criação sob demanda © LES/PUC-Rio 7 Proxy • Implementação – Subject public interface Pessoa { public String getCodigo(); public String getNome(); } – DAO public class PessoaDAO { public static Pessoa getPessoaByCodigo(String codigo){ System.out.println("select * from PESSOA where codigo="+codigo); return new PessoaReal(codigo,"Pessoa " + codigo); } } © LES/PUC-Rio 8 Proxy • Implementação – RealSubject public class PessoaReal implements Pessoa{ private String nome; private String codigo; public PessoaReal(String codigo, String nome) { this.codigo = codigo; this.nome = nome; System.out.println("Retornou " + nome + " do banco de dados"); } public String getCodigo() { return this.codigo; } public String getNome() { return nome; } } © LES/PUC-Rio 9 Proxy • Implementação – Proxy public class PessoaProxy implements Pessoa{ private String codigo; private Pessoa pessoa; public PessoaProxy(String nome) { this.codigo = nome; } public String getCodigo() { return this.codigo; } public String getNome() { if (pessoa == null) { pessoa = PessoaDAO.getPessoaByCodigo(this.codigo); } return pessoa.getNome(); } } © LES/PUC-Rio 10 Proxy • Implementação – Principal import java.util.ArrayList; import java.util.List; public class ProxyExemplo { public static void main(String[] args) { List<Pessoa> pessoas = new ArrayList<Pessoa>(); pessoas.add(new PessoaProxy(“01")); pessoas.add(new PessoaProxy(“02")); pessoas.add(new PessoaProxy(“03")); System.out.println("Nome: " + pessoas.get(0).getNome()); System.out.println("Nome: " + pessoas.get(1).getNome()); System.out.println("Nome: " + pessoas.get(0).getNome()); System.out.println("Código 3ª pessoa: "+pessoas.get(2).getCodigo()); } } © LES/PUC-Rio 11