1、远程代理
优点:逻辑与实现彻底解耦
#include <iostream>
#include <string>
using namespace std;
//接口
class A
{
public:
virtual ~A() = 0 {}
virtual void request() = 0;
};
//业务执行者A1
class A1 : public A
{
public:
void request()
{
cout<<"A1 request"<<endl;
}
~A1(){}
};
//业务执行者A2
class A2 : public A
{
public:
void request()
{
cout<<"A2 request"<<endl;
}
~A2(){}
};
//代理 逻辑与实现的彻底解耦
class proxy : public A
{
public:
proxy(){}
proxy(A *a){_a = a;}
~proxy(){}
void request(){_a->request();}
private:
A *_a;
};
int main()
{
A1 *a1 = new A1;
proxy p1(a1);
p1.request();
A2 *a2 = new A2;
proxy p2(a2);
p2.request();
return 0;
}
2、虚代理
优点:创建资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。
#include <iostream>
#include <string>
using namespace std;
class Image
{
public:
Image(string name):_imageName(name){}
virtual ~Image() = 0{}
virtual void show() = 0;
protected:
string _imageName;
};
class BigImage : public Image
{
public:
BigImage(string name):Image(name){}
~BigImage(){}
void show(){cout << "show big image : " << _imageName << endl;}
};
class BigImageProxy : public Image
{
public:
BigImageProxy(string name):Image(name),_bigImage(NULL){}
~BigImageProxy()
{
if(_bigImage)
delete _bigImage;
}
void show()
{
if(!_bigImage)
_bigImage = new BigImage(_imageName);
_bigImage->show();
}
private:
BigImage *_bigImage;
};
int main()
{
Image *image = new BigImageProxy("proxy.jpg"); //代理
image->show(); //需要时由代理负责打开
delete image;
return 0;
}