代理模式简介:
让一个类代理另一个类去执行另一类的功能,属于结构型设计模式。
适用场景:
- 远程代理,为一个对象在不同的地址空间提供局部代表。
- 虚代理,在创建开销很大的对象的时候。可以让代理对象根据需要在不同的时机创建原始对象。避免同时创建,提高响应速度。
- 保护代理,控制对原始对象的访问。
- 智能指引,在访问原始对象时可以执行一些附加操作,以丰富原始对象的功能。
采用菜鸟教程的例子,这里用C++实现
#include<iostream>
#include<string>
using namespace std;
//创建一个图片image基类接口
class image
{
public:
image() {};
virtual ~image() {};
virtual void display()=0;
};
//创建实现image接口的实体类RealImage
class RealImage :public image
{
public:
RealImage(string tfilename);
~RealImage() {};
void display();
private:
string filename;
void loadFromDisk(string filename);
};
RealImage::RealImage(string tfilename)
{
this->filename = tfilename;
loadFromDisk(filename);
}
void RealImage::display()
{
cout << "RealImage:display: " <<filename<< endl;
}
void RealImage::loadFromDisk(string filename)
{
cout << "loadFromDisk: " << filename << endl;
}
//创建实现image接口的代理类ProxyImage
class ProxyImage :public image
{
public:
ProxyImage(string tfilename);
~ProxyImage();
void display();
private:
RealImage *realimage; //包含image实体类成员变量
string filename;
};
ProxyImage::ProxyImage(string tfilename)
{
this->filename = tfilename;
realimage = NULL;
}
ProxyImage::~ProxyImage()
{
delete realimage;
realimage = NULL;
}
void ProxyImage::display()
{
if (NULL == realimage)
{
realimage = new RealImage(filename);
}
realimage->display();
}
int main()
{
image *t1 = (image*)new ProxyImage("test10.jpg");
t1->display();
cout << endl;
t1->display();
delete t1;
t1 = NULL;
system("pause");
return 0;
}
在visual studio 2015上运行结果: