Você está na página 1de 6

1

09/05/08 1
Tpi c os Avan ados em
Li nguagem de Pr ogr ama o
Padres de Projeto
Proxy
Prof. Alexandre Vidal
DEINF-UFMA
09/05/08 2
Pr oxy

Classificao:

Propsito: Estrutural

Escopo: Objetos

Inteno: Responsabilidade (Metsker)

inteno:

fornecer um substituto de outro objeto para


controlar o acesso ao mesmo.

a.k.a.: Surrogate
09/05/08 3
Pr oxy

motivao:

adiar o custo da criao integral e inicializao de um


objeto at o momento necessrio.

por exemplo, criao de objetos grficos, tais como


grandes imagens.
09/05/08 4
Pr oxy

Motvao:

2
09/05/08 5
Pr oxy

apcabdade:
remote proxy: representante oca para um obeto
remoto. Ex:acesso a remote dbms, CORBA;
vrtua proxy: cra obetos caros sob demanda.
Ex:mage proxy;
protecton proxy: controa o acesso para o obeto
orgna;
smart reference: adcona operaes sobre um
pointer:

garbage coecton (controe do nmero de


referncas);

verfca se o obeto rea est boqueado antes de


ser acessado.
09/05/08 6
Pr oxy

Estrutura
09/05/08 7
Pr oxy

Participantes

Proxy:

mantm uma referncia para o objeto real;

fornece interface idntica a de Subject;

controla o acesso ao objeto real;

pode ser responsvel pela criao ou excluso do objeto


real;
09/05/08 8
Pr oxy

Participantes

Proxy:

remote proxies: codificam e enviam uma solicitao


para um objeto real em outro espao de
endereamento;

virtual proxies: podem manter cache sobreo objeto real


para postergar o acesso ao mesmo;

protection proxies: verificam permisses de acesso do


solicitante.

3
09/05/08 9
Pr oxy

Participantes

Subject:

define uma interface comum para RealSubject e Proxy;

RealSubject:

define o objeto real representado pelo proxy.


09/05/08 10
Pr oxy

Colaboraes

o Proxy pode, quando for apropriado, repassar


solicitaes para o RealSubject.
09/05/08 11
Pr oxy

Conseqncias

um proxy remoto pode ocultar o fato de que um


objeto reside em um espao de endereamento
diferente;

um proxy virtual pode implementar otimizaes,


como criao de um objeto sob demanda;
09/05/08 12
Pr oxy

Implementao

C++ suporta sobrecarga do operador de acesso a


membros ->.

Isso permite realizar tarefas adicionais sempre


que um objeto for dereferenciado; o que pode ser
til na implementao de alguns tipos de proxy; o
proxy se comporta como um ponteiro;

4
09/05/08 13
Pr oxy

Proxy - Implementao
ImagePtr::ImagePtr (const char*
theImageFe) {
mageFe = theImageFe;
mage = 0; }
Image* ImagePtr::LoadImage () {
f (mage == 0) {
mage =
LoadAnImageFe(mageFe); }
return mage; }
The overoaded -> and * operators use
LoadImage to return mage to caers
(oadng t f necessary).
Image* ImagePtr::operator-> () {
return LoadImage(); }
Image& ImagePtr::operator* () {
return *LoadImage(); }
//
ImagePtr mage =
ImagePtr("anImageFeName");
mage->Draw(Pont(50, 100));
// (mage.operator->())->Draw(Pont(50,
100))
cass Image;
extern Image*
LoadAnImageFe(const char*);
// externa functon
cass ImagePtr {
pubc:
ImagePtr(const char* mageFe);
vrtua -ImagePtr();
vrtua Image* operator->();
vrtua Image& operator*();
prvate:
Image* LoadImage();
prvate:
Image* mage;
const char* mageFe;
};
09/05/08 14
Pr oxy

Implementao

o proxy s precisa conhecer o objeto real se vai


instanci-los. Caso contrrio, podem tratar todas
as classes Realsubject de maneira uniforme.
09/05/08 15
Pr oxy

exemplo de cdigo
A casse Craphic defne a nterface para obetos grfcos:
cass Graphc {
pubc:
vrtua -Graphc();
vrtua vod Draw(const Pont& at) = 0;
vrtua vod HandeMouse(Event& event) = 0;
vrtua const Pont& GetExtent() = 0;
vrtua vod Load(stream& from) = 0;
vrtua vod Save(ostream& to) = 0;
protected:
Graphc();
};
09/05/08 16
Pr oxy

exemplo de cdigo
A casse lmage mpementa a nterface Craphic para mostrar
arquvos de magem. lmage sobrescreve HandleMouse para
dexar os usuros redmensonar a magem nteratvamente.
cass Image : pubc Graphc {
pubc:
Image(const char* fe); // oads mage from a fe
vrtua -Image();
vrtua vod Draw(const Pont& at);
vrtua vod HandeMouse(Event& event);
vrtua const Pont& GetExtent();
vrtua vod Load(stream& from);
vrtua vod Save(ostream& to);
prvate:
// ... };

5
09/05/08 17
Pr oxy

exemplo de cdigo
lmageProxy tem a mesma nterface que lmage:
cass ImageProxy : pubc Graphc {
pubc:
ImageProxy(const char* mageFe);
vrtua -ImageProxy();
vrtua vod Draw(const Pont& at);
vrtua vod HandeMouse(Event& event);
vrtua const Pont& GetExtent();
vrtua vod Load(stream& from);
vrtua vod Save(ostream& to);
protected:
Image* GetImage();
prvate:
Image* mage;
Pont extent;
char* feName; };
09/05/08 18
Pr oxy

exemplo de cdigo
O construtor sava uma cpa oca do nome do arquvo que
armazena a
magem, e ncaza os atrbutos extent e image:
ImageProxy::ImageProxy (const char* feName) {
feName = strdup(feName);
extent = Pont::Zero; // don't know extent yet
mage = 0; }
Image* ImageProxy::GetImage() {
f (mage == 0) {
mage = new Image(feName);
}
return mage; }
09/05/08 19
Pr oxy

exemplo de cdigo
A mpementao de CetExtent retorna o tamanho
armazenado no cache, se for possve; seno, carregado
da magem em arquvo. Draw carrega a magem, e
HandleMouse encamnha o evento para a magem rea.
const Pont& ImageProxy::GetExtent () {
f (extent == Pont::Zero)
extent = GetImage()->GetExtent();
return extent; }
vod ImageProxy::Draw (const Pont& at) {
GetImage()->Draw(at); }
vod ImageProxy::HandeMouse (Event& event) {
GetImage()->HandeMouse(event); }
09/05/08 20
Pr oxy

exemplo de cdigo
A operao 5ave sava o tamanho da magem em cache e o
nome do arquvo de magem para um stream. Load
recupera esta nformao e atrbu vaores ncas aos
membros correspondentes.
vod ImageProxy::Save (ostream& to) {
to << extent << feName;
}
vod ImageProxy::Load (stream& from) {
from >> extent >> feName;
}

6
09/05/08 21
Pr oxy

exemplo de cdigo
Fnamente, supondo que temos uma casse TextDocument
que pode conter obetos Craphic :
cass TextDocument {
pubc:
TextDocument();
vod Insert(Graphc*);
// ...
};
Podemos nserr um ImageProxy em um documento texto:
TextDocument* text = new TextDocument;
// ...
text->Insert(new ImageProxy("anImageFeName"));
09/05/08 22
Pr oxy

Proxy
exempo de cdgo (ava)
pubc cass ImageProxy extends IPane{
. . .
pubc vod pant(Graphcs g) {
f (tracker.checkID(0)) {
g.drawImage(mg, 0, 0, ths);//draw oaded mage
} ese {//draw box outnng mage f not oaded yet
g.setCoor(Coor.back);
g.drawRect(1, 1, wdth-2, heght-2);
}
}
}
09/05/08 23
Pr oxy

usos conhecidos

ver pgina 207 no GoF (traduzido);


09/05/08 24
Pr oxy

Padres Relacionados

Adapter

um adapter prov uma interface diferente para o objeto que ele


adapta. Em contraste, um proxy prov a mesma interface como
seu sujeito. Contudo, um proxy usado para proteo de accesso
poderia recusar executar uma operao que o sujeito executaria,
ento sua interface pode ser efetivamente um subconjunto da do
sujeito que representa.

Decorator

embora possam ter implementao semelhante, decorators tm


propsito diferente dos proxies. Um decorator adiciona uma ou
mais responsibilidades a um objeto, enquanto um proxy controla o
accesso a um objeto.

Você também pode gostar