O documento descreve o padrão de projeto Proxy. O Proxy fornece um substituto ou representante para outro objeto, controlando o acesso a ele. Isso permite adiar a criação de objetos caros até serem realmente necessários, melhorando o desempenho. O Proxy também pode controlar acesso e realizar outras tarefas sempre que o objeto for acessado.
2. Proxy
• Provê um substituto para um outro objeto
para controlar o acesso a ele
• Proxy é representante/substituto
• Também conhecido como Surrogate:
substituto/representante
2 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
3. Motivação
• Uma razão para se controlar acesso a um
objeto é se adiar o “custo” de sua criação
e inicialização até que realmente se
precise usá-lo
• Exemplo: editor de documento que pode
embutir objetos gráficos
– Grandes imagens (raster) são custosas para
se criar
– Abrir 1 doc devem ser uma ação rápida
– Objeto é criado “sob demanda”, quando a
imagem se torna visível
3 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
4. Motivação
• O que colocar no lugar?
• Como esconder o fato da criação sob
demanda para não complicar a
implementação do editor?
• Como não impactar na renderização e
formatação do texto?
4 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
5. Motivação
• Solução: usar um outro objeto (proxy), que aja
como se fosse a imagem e se encarrega de
instanciá-la, quando a mesma for requerida (e
manter uma referência para a mesma para
redirecionar futuras requisições)
5 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
6. Motivação
6 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
7. Aplicação
• Sempre que haja a necessidade de uma
referência a um objeto mais versátil e
sofisticada do que um simples ponteiro:
1. Um proxy remoto provê um representante
local para um objeto em um espaço de
endereçamento diferente
2. Um proxy virtual cria objetos “caros” sob
demanda
7 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
8. Aplicação
3. Um proxy de proteção controla o acesso ao objeto
original
– útil quando objetos devem ter direitos de acesso diferentes
4. Uma referência esperta é um substituto para um
ponteiro que realiza ações adicionais quando um
objeto é acessado, ex:
– Para contar o número de referências ao objeto real com o
propósito de garbage collection (também conhecido como
ponteiro esperto)
– Para carregar um objeto persistente na memória quando
ele é referenciado a primeira vez
– Para checar que o objeto real está travado antes que ele
seja acessado, assegurando que nenhum outro objeto o
altere
8 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
9. Estrutura
9 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
10. Estrutura
10 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
11. Participantes
• Proxy (ImageProxy)
– Mantém uma referência que permite o proxy
acessar o objeto real
– Provê uma interface idêntica a de Subject
para que o proxy possa substituir o objeto
real
– Controla o acesso ao objeto real e pode ser
responsável pela criação e remoção do
mesmo
11 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
12. Participantes
– Outras responsabilidades dependem do tipo de
proxy:
• Remote proxies
• Virtual proxies
• Protection proxies
• Subject (Graphic)
– Define a interface comum para RealSubject e Proxy,
para que um Proxy possa ser usado em qualquer
lugar que um RealSubject seja esperado
• RealSubject (Image)
– Define o objeto real que o proxy representa
12 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
13. Colaborações
• Proxy encaminha as requisições para o
RealSubject quando apropriado,
dependendo do tipo de proxy
13 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
14. Conseqüências
• Adiciona 1 nível de indireção. O uso da mesma depende do
tipo:
– Remote proxy: esconde o fato do objeto real residir em um
espaço de enderaçamento diferente
– Virtual proxy: provê otimizações, tais como criar um objeto
sob demanda
– Protection Proxy e Smart References: permitem tarefas
“caseiras” adicionais qdo um obj é acessado
• Outra otimização: copy-on-write
14 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
15. Implementação
• Sobrecarga do operador de acesso a membro
em C++ ( ->):
✗ Permite realizar tarefas adicionais sempre que um
objeto é referenciado ( o proxy se comporta como um
ponteiro )
15 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
16. Implementação
16 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
17. Implementação
17 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
18. Exemplo: Virtual Proxy
18 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
19. Exemplo
19 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
20. Exemplo
20 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
21. Exemplo
21 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
22. Exemplo
22 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
23. Exemplo
23 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
24. Exemplo
24 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma