浅析代理模式

     代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
一、 代理的种类
1、虚拟代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
2、远程代理:为一个位于不同的地址空间的对象提供一个局域代表对象。
3、智能引用代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来。
4、保护代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
5、Copy-on-Write代理:虚拟代理的一种,把复制拖延到只有在客户端需要时,才真正采取行动。
6、Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享到这个结果。
7、防火墙代理:保护目标,不让恶意用户接近。
8、同步化代理:使几个用户能够同时使用一个对象而没有冲突。
虚拟代理、远程代理、只能引用代理、保护代理是最为常见的代理模式。

二、代理模式的结构
1、抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以使用代理主题。
2、代理主题角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主体;控制对真实主题的引用,负责在需要的时候创建真实主题对象和删除真实主题对象;代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯的将调用传递给真实主题对象。
3、真实主题角色:定义了代理角色所代表的真实对象。
首先,代理主题并不改变主题的接口,因为模式的用意是不让客户端感觉到代理的存在;其次,代理使用委派将客户端的调用委派给真实的主题对象,换言之,代理主题起到了一个传递请求的作用;最后,代理主题在传递请求之前和之后都可以执行特定的操作,而不是单纯的传递请求。

代理模式的请求过程:
客户端向代理主题发送请求,代理主题在接收到请求的同时,执行一个preRequest()操作,然后才把请求传递给真实主题,在真实主题将请求返回时,代理主题又执行了一个postRequest()操作,才将控制返回给客户端。
与客户端直接向真实主题发送请求的情况相比,使用代理主题的显著好处是,系统提供了向真实主题传递客户端请求的控制。代理主题可以在向真实主题传递客户端请求之前执行特定的操作,并决定是否将请求传递给真实主题;代理主题可以在向真实主题传递客户端请求之后执行另外一种操作,比如将客户端请求计数等。客户端有可能跟本没有直接向真实主题提出请求的许可,而代理主题有这个许可,因此,代理主题可以在执行preRequest()操作后决定是否再传递请求。总之,代理模式将一个中间层插入到客户端和主题角色之间,从而提供很多的灵活性。


java语言通过在java.lang.reflect库中提供下面三个类直接支持代理模式
1、Proxy:能够在运行时间创建代理
2、InvocationHandler
3、Method
其中Proxy类使得设计师能够在运行时间创建代理队象。

创建代理对象的步骤:
当系统有了一个代理对象后,对原对象的方法调用会首先被分配给一个调用处理器,程序可以在调用处理器的invoke()方法中截获这个调用,进行额外的操作。
1、指明一系列的接口来创建一个代理对象
2、创建一个调用处理器(Invocation Handler)对象。
3、将这个代理指定为某个其他对象的代理对象。
4、在调用处理器的invoke()方法中采取代理,一方面将调用传递给真实对象,另一方面执行各种需要做的操作。

三、代理模式的优缺点
根据代理种类的不同,代理模式有不同的特点。
1、远程代理:优点是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理对象是局域的而不是远程的,而代理对象承担了大部分的网络通信工作。
2、虚拟代理:优点是代理对象可以在必要的时候才能将被代理的对象加载。代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的时候,虚拟代理就非常好。
3、保护代理:优点是可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。
4、智能引用代理:在访问一个对象时可以执行一些内务操作(houseKeeping)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值