- 代理模式是为其他对象提供一种代理以控制和对这个对象的访问;
- 在代理模式中,问哦们创建具有现有对象的对象,以便想外界提供功能接口;
- 在某种情况下,一个对象不舍和或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用
- 意图:为其他对象提供一种代理以控制对这个对象的访问;
- 解决的问题: 在直接访问对象时带来一些问题,如:要访问的对象在远程的机器桑。在面向对象的系统中(比如创建对象的开销很大,或者某些操作需要控制,或者需要远程的访问),直接访问会给使用者或者系统带来很多的麻烦,物品们可以在访问对象时家上一个对此对象的访问层;
- 使用时机:想在访问一个类时做一些控制;
- 解决方法:增加中间层;
- 关键代码:实现与被代理类的组合;
-
优点:
职责清晰、高扩展性、智能化 -
缺点 :
1、由于在客户端和帧是主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢;
2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂;
实例:
我们船舰一个Image接口和实现了Image接口的实体类。ProxyImage是一个代理类,减少RealImage对象加载的内存占用,原理框图如下:
代理模式框图.PNG
- 代码实现:
#include <iostream>
#include <string>
using namespace std;
//创建接口类
class ImageInterface
{
public:
virtual void display()=0; //纯虚函数,不允许该类创建实例
};
//创建实体类
class RealImage:public ImageInterface
{
private:
string *m_fileName;
public:
void loadFromDisk(string *fileName)
{
cout<<"Loading "<<(*fileName)<<endl;
}
RealImage(string *fileName)
{
m_fileName = fileName;
loadFromDisk(fileName);
}
//@override
virtual void display()
{
cout<<"Display "<<(*m_fileName)<<endl;
}
};
//创建代理类
class ImageProxy:public ImageInterface
{
private:
RealImage *m_realImage;
string *m_fileName;
public:
ImageProxy(string *fileName)
{
m_fileName = fileName;
}
//@override
virtual void display()
{
if(m_realImage == NULL)
{
m_realImage = new RealImage(m_fileName);
}
m_realImage->display();
}
};
//编写测试案例
int main()
{
// 1、获取代理对象
string filname="snow.jpeg";
ImageInterface *image = new ImageProxy(&filname);
// 2、图像需要从磁盘加载
image->display();
// 图像不需要从磁盘中加载
image->display();
}
///////////////////////输出结果/////////////////////////
Loading snow.jpeg
Display snow.jpeg
Display snow.jpeg
从输出结果可以看出调用了代理对象两次display()函数,只加载了一次,节省了内存资源。
注:如何用对象而不用指针实现