【设计模式】结构型模式之Proxy代理

时间:2022-06-13 07:42:06

Proxy代理是一种对象结构型设计模式,意在为其它对象提供一种代理以控制对这个对象的访问,对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。

Proxy模式的结构如下图所示:

【设计模式】结构型模式之Proxy代理

上图中,Proxy保存一个引用使得代理可以访问实体,若RealSubject和Subject的接口相同,Proxy会引用Subject;Proxy提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体;Proxy控制对实体的存取,并可能负责创建和删除它。Subject定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。RealSubject定义Proxy所代表的实体。

常见的代理包括远程代理、虚代理、保护代理和智能引用。远程代理为一个对象在不同的地址空间提供局部代表,可以隐藏一个对象存在于不同地址空间的事实。虚代理根据需要创建开销很大的对象,可以进行最优化,例如根据要求创建对象。保护代理控制对原始对象的访问,用于对象应该有不同的访问权限的时候。智能引用取代了简单的指针,它在访问对象时执行一些附加操作。在实际情况中,代理根据其种类,在适当的时候向RealSubject转发请求。

Proxy模式还可以对用户隐藏另一种称之为copy-on-write的优化方式,该优化与根据需要创建对象有关,可以大幅度地降低拷贝庞大实体时的开销。拷贝一个庞大而复杂的对象是一种开销很大的操作,如果这个拷贝根本没有被修改,那么这些开销就没有必要,用代理延迟这一拷贝过程,可以保证只有当这个对象被修改的时候才对它进行拷贝。在实现copy-on-write时必须对实体进行引用计数,拷贝代理仅会增加引用计数,只有当用户请求一个修改该实体的操作时,代理才会真正的拷贝它,在这种情况下,代理还必须减少对实体的引用计数,当引用计数为零时,这个实体将被删除。