设计模式--代理模式Proxy(结构型)

时间:2022-05-02 20:28:19

一、代理模式

为其他对象提供一种代理以控制对这个对象的访问。

代理模式分为四种:

远程代理:为了一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的对象。

安全代理:用来控制真实对象访问时的权限。

智能指引:当调用目标对象时,代理可以处理其他的一些操作。(智能指针)

二、UML图

设计模式--代理模式Proxy(结构型)

三、例子

(1)虚代理

考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。这里就可以运用代理模式,在打开文档时,并不打开图形对象,而是打开图形对象的代理以替代真实的图形。待到真正需要打开图形时,仍由代理负责打开。

设计模式--代理模式Proxy(结构型)

class Image
{
public:
Image(string name): m_imageName(name) {}
virtual ~Image() {}
virtual void Show() {}
protected:
string m_imageName;
};
class BigImage: public Image
{
public:
BigImage(string name):Image(name) {}
~BigImage() {}
void Show() { cout<<"Show big image : "<<m_imageName<<endl; }
};
class BigImageProxy: public Image
{
private:
BigImage *m_bigImage;
public:
BigImageProxy(string name):Image(name),m_bigImage() {}
~BigImageProxy() { delete m_bigImage; }
void Show()
{
if(m_bigImage == NULL)
m_bigImage = new BigImage(m_imageName);
m_bigImage->Show();
}
}; int main()
{
Image *image = new BigImageProxy("proxy.jpg"); //代理
image->Show(); //需要时由代理负责打开
delete image;
return ;
}