设计模式之代理模式

来源:互联网 发布:linux c 定时器 编辑:程序博客网 时间:2024/06/06 19:52

1.代理模式的意图

        通过提供一个代理或占位符来控制对该对象的访问;

2.代理模式解读

 1)代理的思路及原理:

       image

      由上图可知,通过增加代理来解耦A与C之间的调用,这样可以封装原来C调用A的一些相关细节,转换成C直接调用B中封装后的代理方法,则等同于访问A。

 2)代理模式与外观模式的区别

      代理模式与外观模式的侧重点不同,外观模式是将众多细粒度的功能,封装成一个粗粒度的功能,供客户应用程序使用。而代理模式,为其他对象提供一个代理类,通过该代理类来完成目标对象的访问,代理模式相对外观模式来说,关键不同是在内部,外观我们知道是将细粒度的功能进行简单封装,而代理模式则是内部实现很复杂,其复杂性主要体现在来自如下的几类复杂性:

         image

       可能上述的复杂性还不完整,例如还可能有目前的比较新兴的大数据量的虚拟代理或者是智能代理,这方面由于自身不足,所以还无法讲述。

 3)Uml类图

Uml图:


代理角色(Proxy):
. 保存一个引用使得代理可以访问实体。若 RealSubject和Subject的接口相同,Proxy会引用Subject。
. 提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。
. 控制对实体的存取,并可能负责创建和删除它。
. 其他功能依赖于代理的类型:
• Remote Proxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。
• Virtual Proxy可以缓存实体的附加信息,以便延迟对它的访问。
• Protection Proxy检查调用者是否具有实现一个请求所必需的访问权限。

抽象主题角色(Subject):定义真实主题角色RealSubject 和 抽象主题角色Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。代理主题通过持有真实主题RealSubject的引用,不但可以控制真实主题RealSubject的创建或删除,可以在真实主题RealSubject被调用前进行拦截,或在调用后进行某些操作. 

真实主题角色(RealSubject):定义了代理角色(proxy)所代表的具体对象.  

 4)代理模式的经典实现

下面给出代理模式的经典实现:

       我们以如下场景为例,我们现在要实现一个MP3播放的相关功能,一般来说有很多的音频文件;

下面我们来看看如何使用代理模式来实现。

       (1)、定义客户端调用的具体的音乐媒体类型类型

                image

        (2)、定义客户端调用的目标对象的接口

                image

        (3)、定义具体的目标类型的实现

                image

        (4)、定义代理类,该代理类实现了目标类型的接口。

                image

         (5)、具体的客户端调用

                image

         上面基本上给出了一个简单的例子说明,当然具体的代理模式的思路就是这样了,当然参考上面的类图来做的话,和我的这个形式差不多,具体的思想就是为目标类型定义一个接口,然后代理类实现该接口,那么在代理类中指定具体的目标类型的调用,完成目标类型的调用,返回调用后的结果,那么就等于代理类封装了目标类型的调用。

3.代理模式优缺点
  1)优点:代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
   2)缺点:
       由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
       实现代理模式需要额外的工作,有些代理模式的实现非常复杂。


原创粉丝点击