介绍
代理模式为其他对象提供一种代理以控制这个对象的访问,其目的就是为了延迟所代理对象的创建,因为有的对象创建开销十分大,从而影响用户体验,比如:考虑一个可以嵌入图像的文档编辑器,有些图像创建的开销很大,但是打开文档必须迅速,我们可以延迟图像对象的创建。
代理模式的参与者
- Proxy 保存一个引用,使得代理对象可以访问实体
- Subject 定义实体和代理的共用接口
- RealSubject 代理的实体
实现代码
class Graphic{//Subject 定义实体和代理的共用接口
public:
virtual ~Graphic(){}
virtual void Draw() = 0;
virtual void Save() = 0;
virtual void Load() = 0;
};
class Image : public Graphic {//RealSubject 代理的实体
public:
Image(std::string place)
{
_place = place;
}
void Draw() override
{
std::cout<<"Drawing......"<<std::endl;
}
void Save() override
{
std::cout<<"Saving..... in "<<_place<<std::endl;
}
void Load() override
{
std::cout<<"Loading.... from "<<_place<<std::endl;
}
private:
std::string _place;
};
class ImageProxy : public Graphic {//Proxy 保存一个引用,使得代理对象可以访问实体
public:
ImageProxy(std::string place)
{
image = nullptr;
_place = place;
}
void Draw() override
{
if(image == nullptr)
{
std::cout<<"new Image in Draw()"<<std::endl;
image = new Image(_place);
}
image->Draw();
}
void Save() override
{
if(image == nullptr)
{
std::cout<<"new Image in Save()"<<std::endl;
image = new Image(_place);
}
image->Save();
}
void Load() override
{
if(image == nullptr)
{
std::cout<<"new Image in Load()"<<std::endl;
image = new Image(_place);
}
image->Load();
}
private:
Image *image;
std::string _place;
};
int main()
{
ImageProxy *proxy = new ImageProxy("d:/images");
proxy->Draw();
proxy->Load();
proxy->Save();
};
输出
new Image in Draw()
Drawing......
Loading.... from d:/images
Saving..... in d:/images
特点
- 远程代理可以影藏一个对象存在于不同空间地址的事实
- 虚拟代理可以进行最优化,例如根据要求创建对象
- 保护代理,智能引用都允许在访问一个对象时有一些附加的事务处理
参考
《设计模式:可复用面向对象软件的基础》
网友评论