设计模式学习笔记(十三)——Proxy代理
2007-02-08 10:35
531 查看
十二、Proxy(代理)
情景举例:
为其他对象提供一种代理以控制对这个对象的访问。
四种常见情况:(1)远程代理(2)虚代理(3)保护代理(4)智能指针
代码示例:
个人理解:
代理模式是一种有各种变形的、应用非常广泛的模式。模式的关键是代理类与实际类拥有共同的父类(例中的Graphic类),而在代理类中保存着实际类的引用,代理类则可以在使用实际类之前添加自己的操作。
情景举例:
为其他对象提供一种代理以控制对这个对象的访问。
四种常见情况:(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类),而在代理类中保存着实际类的引用,代理类则可以在使用实际类之前添加自己的操作。
相关文章推荐
- 步步为营 .NET 设计模式学习笔记 十三、Bridge (桥接模式)
- 设计模式学习笔记(十三)——Proxy代理模式
- 设计模式学习笔记(十三)—Iterator迭代器模式
- 设计模式学习笔记十三:外观模式(Facade Pattern)
- 设计模式学习笔记十三——结构型模式总结
- java 设计模式学习笔记十三 observer设计者模式
- java 设计模式学习笔记十三 observer设计者模式
- 设计模式学习笔记十三:模板方法模式
- 设计模式学习笔记(十三)——Proxy代理模式
- 设计模式学习笔记(十三)——Proxy代理模式
- 步步为营 .NET 设计模式学习笔记 十三、Bridge (桥接模式)
- 设计模式学习笔记十三:模板方法模式
- Android开发学习笔记十三 设计模式
- 十三、适配器模式——设计模式学习笔记
- 设计模式学习笔记(十三:原型模式)
- 设计模式学习笔记(十三)——Proxy代理模式
- 设计模式学习笔记(十三)——Proxy代理模式
- 【设计模式学习笔记十三】【结构型模式】【代理模式(Proxy)】
- 步步为营 .NET 设计模式学习笔记 十三、Bridge (桥接模式)
- 设计模式学习笔记(十三)——Proxy代理模式