代理模式 补充

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式组成是:

抽象角色:抽象主题角色,是一个接口。该接口是对象和它的代理共用的接口。
代理角色:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:真实主题角色,是实现抽象主题接口的类。
代理模式有几种,虚拟代理,计数代理,远程代理,动态代理。主要分为两类,静态代理和动态代理。静态代理比较简单,是由程序员编写的代理类,并在程序运行前就编译好的,而不是由程序动态产生代理类,这就是所谓的静态。
动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。
优点:
(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
(3).高扩展性
中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。

代理模式在软件架构上具有非常明显的特点,优点与缺点都是十分的突出。代理模式的优点就是通过一个代理对象完成一系列的处理,在将来的程序改动中,就会允许动态更改、添加、删除和重新定位对象,这使开发人员的发布变得透明,符合开闭原则。代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算机性能与处理速度,可以快速响应并处理客户端请求。代理模式在架构中还可以让虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
  另外代理模式的缺点也是很突出的,要求对服务描述进行标准化,我们要使用代理模式时则需要考虑异步处理机制、协议创建流程和错误环境控制,比较的繁琐。由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。这些问题就造成了不易开发的弱点。

  代理模式是通过引入代理对象来间接访问一个对象,代理模式可以在客户端和目标对象中起到一个中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。

  代理模式在java框架中也有应用,例如spring中AOP技术就是代理模式的应用,只不过是应用较为高级的动态代理模式。另外EJB、Web Service等分布式技术都是代理模式的应用。其实在设计模式中也有代理模式,这就需要分别以下两者的区别,设计模式是架构的手段(之一)。软件架构 :一般场景下拥有设计的选择权;设计模式 :选择后特定场景下的最佳实践,两者的范围还是有很大的差别的,另外我认为如果把做一个项目当成一场战争的话,那么架构就是这场战争的总元帅,而设计模式只是执行命令的一位将军。

 

为什么使用代理模式

客户端无法直接操作实际对象。那么为什么无法直接操作?一种情况是你需要调用的对象在另外一台机器上,你需要跨越网络才能访问,如果让你直接coding去调用,你需要处理网络连接、处理打包、解包等等非常复杂的步骤,所以为了简化客户端的处理,我们使用代理模式,在客户端建立一个远程对象的代理,客户端就象调用本地对象一样调用该代理,再由代理去跟实际对象联系,对于客户端来说可能根本没有感觉到调用的东西在网络另外一端,这实际上就是Web Service的工作原理。另一种情况虽然你所要调用的对象就在本地,但是由于调用非常耗时,你怕影响你正常的操作,所以特意找个代理来处理这种耗时情况,一个最容易理解的就是Word里面装了很大一张图片,在word被打开的时候我们肯定要加载里面的内容一起打开,但是如果等加载完这个大图片再打开Word用户等得可能早已经跳脚了,所以我们可以为这个图片设置一个代理,让代理慢慢打开这个图片而不影响Word本来的打开的功能。

除了当前类能够提供的功能外,我们还需要补充一些其他功能。最容易想到的情况就是权限过滤,我有一个类做某项业务,但是由于安全原因只有某些用户才可以调用这个类,此时我们就可以做一个该类的代理类,要求所有请求必须通过该代理类,由该代理类做权限判断,如果安全则调用实际类的业务开始处理。可能有人说为什么我要多加个代理类?我只需要在原来类的方法里面加上权限过滤不就完了吗?在程序设计中有一个类的单一性原则问题,这个原则很简单,就是每个类的功能尽可能单一。为什么要单一,因为只有功能单一这个类被改动的可能性才会最小,就拿刚才的例子来说,如果你将权限判断放在当前类里面,当前这个类就既要负责自己本身业务逻辑、又要负责权限判断,那么就有两个导致该类变化的原因,现在如果权限规则一旦变化,这个类就必需得改,显然这不是一个好的设计。

posted on 2018-05-25 14:48  super大蜗牛  阅读(138)  评论(6编辑  收藏  举报

导航