Escolar Documentos
Profissional Documentos
Cultura Documentos
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:
a.k.a.: Surrogate
09/05/08 3
Pr oxy
motivao:
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:
Estrutura
09/05/08 7
Pr oxy
Participantes
Proxy:
Participantes
Proxy:
Participantes
Subject:
RealSubject:
Colaboraes
Conseqncias
Implementao
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
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
Padres Relacionados
Adapter
Decorator