代理模式:为其他对象提供一种代理以控制对这个对象的访问。
对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化,比如在一个文档编辑器中插入一个图片,有些图片的创建的开销很大,但是又要求打开文档速度要求很快,因此在打开文档时应该避免创建开销大的对象,因为并非打开文档时文档中的所有资源都必须可见,所以没必要一次性同时创建所有对象而应该在需要显示对应的资源也就是需要显示图片时才对图片就行加载和创建,这种解决方案即为“代理模式”,文档编辑器对象保存了这个图片对象的代理,而在需要显示图片时通过这个代理创建相关的图片资源。
代理模式的应用:
1、远程代理:为一个对象在不同的地址空间提供局部代表,比如说代理服务器为你在访问远程服务器时提供了 一个代理,使得访问速度变化。
2、虚代理:根据需要创建开销很大的对象。如上所说的图片代理。
3、保护代理:控制对原始对象的访问,用于对象有不同的访问权限的时候。
4、智能指引:取代了简单的指针,在访问对象时执行了一些附加的操作。如C++中的auto_ptr就是使用了代理模式,使我们可以不关注资源的释放。(执行附加的操作可以理解为对原始类作前处理和后处理等)
代码示例:
Graphic.h
#include <iostream>
class Graphic
{
public:
void virtual Draw()=0;
virtual ~Graphic();
};
class Image :Graphic
{
public:
Image(std::string str);
virtual ~Image();
virtual void Draw();
private:
std::string filename;
};
class ImageProxy : Graphic
{
public:
ImageProxy(std::string str);
virtual void Draw();
virtual ~ImageProxy();
private:
Image* pImg;
std::string filename;
};
Graphic.cpp
#include "Graphic.h"
Graphic::~Graphic()
{}
Image::Image(std::string str)
{
filename = str;
}
void Image::Draw()
{
std::cout << filename.c_str() << " Image Show" << std::endl;
}
Image::~Image()
{}
ImageProxy::ImageProxy(std::string str)
{
filename = str;
}
void ImageProxy::Draw()
{
if (pImg == NULL)
pImg = new Image(filename);
pImg->Draw();
}
ImageProxy::~ImageProxy()
{
if (NULL != pImg)
delete pImg;
}
客户端代码:
#include"Graphic.h"
int main()
{
ImageProxy img("ImageFileName.jpg");
img.Draw();
return 0;
}