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
Download

Slides - (LES) da PUC-Rio