您的位置:首页 > 其它

设计模式学习笔记(十三)——Proxy代理

2007-02-08 10:35 531 查看
十二、Proxy(代理)
情景举例:
为其他对象提供一种代理以控制对这个对象的访问。
四种常见情况:(1)远程代理(2)虚代理(3)保护代理(4)智能指针
代码示例:
/*这个例子是虚代理的例子。

*/

/*代理类与实际类公共接口

*/

classGraphic{

public:

virtual~Graphic();

/*

*/

virtualvoidDraw(constPoint&at)=0;

virtualvoidHandleMouse(Event&event)=0;

/*

*/

virtualconstPoint&GetExtent()=0;

/*

*/

virtualvoidLoad(istream&from)=0;

virtualvoidSave(ostream&to)=0;

protected:

Graphic();

};

/*实际类

*/

classImage:publicGraphic{

public:

Image(constchar*file);//loadsimagefromafile

virtual~Image();

/*

*/

virtualvoidDraw(constPoint&at);

virtualvoidHandleMouse(Event&event);

/*

*/

virtualconstPoint&GetExtent();

/*

*/

virtualvoidLoad(istream&from);

virtualvoidSave(ostream&to);

private:

//...

};

/*代理类

*/

classImageProxy:publicGraphic{

public:

ImageProxy(constchar*imageFile);

virtual~ImageProxy();

/*

*/

virtualvoidDraw(constPoint&at);

virtualvoidHandleMouse(Event&event);

/*

*/

virtualconstPoint&GetExtent();

/*

*/

virtualvoidLoad(istream&from);

virtualvoidSave(ostream&to);

protected:

Image*GetImage();

private:

Image*_image;

Point_extent;

char*_fileName;

};

/*构造函数只保存了文件名,并不实际打开文件。

*/

ImageProxy::ImageProxy(constchar*fileName){

_fileName=strdup(fileName);

_extent=Point::Zero;//don'tknowextentyet

_image=0;

}

/*只有当实际需要使用文件时才真正生成对象(延迟处理)

*/

Image*ImageProxy::GetImage(){

if(_image==0){

_image=newImage(_fileName);

}

return_image;

}

constPoint&ImageProxy::GetExtent(){

if(_extent==Point::Zero){

_extent=GetImage()->GetExtent();

}

return_extent;

}

/*

*/

voidImageProxy::Draw(constPoint&at){

GetImage()->Draw(at);

}

/*

*/

voidImageProxy::HandleMouse(Event&event){

GetImage()->HandleMouse(event);

}

/*

*/

voidImageProxy::Save(ostream&to){

to<<_extent<<_fileName;

}

/*

*/

voidImageProxy::Load(istream&from){

from>>_extent>>_fileName;

}

/*

*/

classTextDocument{

public:

TextDocument();


voidInsert(Graphic*);

//...

};

/*主程序中演示了代理的用法。

*/

voiddummy(){

/*

*/

TextDocument*text=newTextDocument;

//...

text->Insert(newImageProxy("anImageFileName"));

/*

*/

}

个人理解:
代理模式是一种有各种变形的、应用非常广泛的模式。模式的关键是代理类与实际类拥有共同的父类(例中的Graphic类),而在代理类中保存着实际类的引用,代理类则可以在使用实际类之前添加自己的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: