TypechoJoeTheme

IT技术分享

统计

代理模式(Proxy)——23种设计模式之结构型模式

2016-04-21
/
0 评论
/
559 阅读
/
正在检测是否收录...
04/21

在面向对象系统中,有些对象由于某种原因(如 对象创建的开销大,或者某些操作需要安全控 制,或者需要进程外的访问等),直接访问会给 使用者、或者系统结构带来很多麻烦。

如何在不失去透明操作对象的同时来管理/控制 这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。

在某些情况下,一个客户不想或者不能直接引 用一个对象,此时可以通过一个称之为“代理” 的第三者来实现间接引用。代理对象可以在客 户端和目标对象之间起到中介的作用,并且可 以通过代理对象去掉客户不能看到的内容和服 务或者添加客户需要的额外服务。

一、知识补充

1、什么是代理

代理模式的英文叫做Proxy或Surrogate,中文都 可译成"代理"。所谓代理,就是一个人或者一 个机构代表另一个人或者另一个机构采取行动。 在一些情况下,一个客户不想或者不能够直接 引用一个对象,而代理对象可以在客户端和目 标对象之间起到中介的作用。

2、常见的代理模式

  • ①、远程(Remote)代理:为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)。
  • ②、虚拟(Virtual)代理:如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
  • ③、Copy-on-Write代理:它是虚拟代理的一种,把复制(克 隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on- Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。
  • ④、保护(Protect or Access)代理:控制对一个对象的访问, 可以给不同的用户提供不同级别的使用权限。
  • ⑤、缓冲(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
  • ⑥、缓冲(Cache)代理:为某一个目标操作的结果提供临时的 存储空间,以便多个客户端可以共享这些结果。
  • ⑦、同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
  • ⑧、智能引用(Smart Reference)代理:当一个对象被引用 时,提供一些额外的操作,如将此对象被调用的次数 记录下来等。

二、类图表示

代理模式涉及到代理(Proxy),实体(Subject),真实实体(RealSubject)

  • ①、Proxy保存一个引用使得proxy可以访问实体提供一个与Subject的接口相同的接口,这样proxy就 可以用来代替实体控制对实体的存取,并可能负责创建和删除它
  • ②、Subject定义RealSubject和Proxy的共同接口。
  • ③、RealSubject定义Proxy所代表的实体

java-proxy-model-1

三、代码示例

//抽象主体
public abstract class AbstractObject {
    public abstract void operation();
}
public class RealObject extends AbstractObject {
    @Override
    public void operation() {
        System.out.println("一些操作");
    }
}
public class ProxyObject extends AbstractObject{
    RealObject realObject = new RealObject();
    @Override
    public void operation() {
        //调用目标对象之前可以做相关操作
        System.out.println("before");
        realObject.operation();
        //调用目标对象之后可以做相关操作
        System.out.println("after");
    }
}
public class Client {

    public static void main(String[] args) {
        AbstractObject obj = new ProxyObject();
        obj.operation();
    }

}

四、模式分析

代理的工作

  • ①、代理主题并不改变主题的接口,因为模式的用意是不让客户端感觉到代理的存在。
  • ②、代理使用委派将客户端的调用委派给真实的主题对象,换言之,代理主题起到的是一个传递请求的作用。
  • ③、代理主题在传递请求之前和之后都可以执行特 定的操作,而不是单纯传递请求。

五、优缺点分析

1、优点

  • ①、系统提供了向真实主题传递客户端请求的控制。
  • ②、将一个中间层插入到客户端和主题角色之间,从而提供了灵活性。
  • ③、代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
  • ④、远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
  • ⑤、虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
  • ⑥、保护代理可以控制对真实对象的使用权限。

2、缺点

  • ①、由于在客户端和真实主题之间增加了代理对象, 因此有些类型的代理模式可能会造成请求的处理速度变慢。
  • ②、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

六、模式间关系

1、与适配器模式的区别

  • ①、二者都把请求转发给目标对象来处理,但实现的接口不一样。
  • ②、Adapter模式中适配器为它所适配的对象提供了一个不同的接口,实现兼容客户类的目的
  • ③、Proxy提供了与它的实体相同的接口,或其接口的子集(Protection Proxy可能会拒绝执行实体的操作)

2、与装饰者模式的区别

  • ①、装饰模式可看作代理模式的一个特殊应用。
  • ②、Decorator的实现和Proxy类似,都提供了到目的对象方法的间接过渡,但目的不同:Decorator对象添加一个或多个功能,而Proxy则控制对对象的访问。
  • ③、Proxy 并不实现和目标对象类似的业务功能,而是一些与目标对象功能联系不太紧密的职责,如权限控制、 连接服务器、处理异常等,二者处理不同问题域的问题。
  • ④、Decorator对象处理的问题与目标对象处理的问题是同一问题域,目的是增加目标对象的功能。Decorator动态地为目标对象添加或减少功能,还可递归地装饰目标对象,产生叠加的效果,而Proxy 无此用途。
  • ⑤、代理模式注重对代理过程的控制装饰模式注重类的功能变化,对类的功能进行加强或减弱

3、与门面模式的区别

  • ①、接口上:代理模式接口不变,Façade模式简化接口
  • ②、关注点上: 代理模式注重对代理过程的控制,为其它对象提供一种代理以控制对这个对象的访问。Façade模式注重“统一的对象”,提供一个访问子系统的接口,Façade对象是外界访问子系统的唯一通道, 子系统中可能代表一个类,可能代表多个对象的集合。

七、应用场景

在需要用比较通用和复杂的对象指针代替简单 的指针时使用Proxy模式。

  • ①、Remote Proxy:为一个对象在不同的地址空间提供局部代表
  • ②、Virtual Proxy:根据需要创建开销很大的对象。
  • ③、Protection Proxy:控制对原始对象的访问,用于对象应该有不同访问权限的时候
  • ④、Smart Reference:取代了简单的指针,在访问对象时执行一些附加操作

八、总结

“增加一层间接层”是软件系统中对许多复杂问题 的一种常见解决办法

  • ①、代理对象维护一个真实对象的引用,而不是维护一个对抽象对象的引用,这是特别要注意的一个地方,因为装饰模式中的装 饰者,组合模式中的组合者都是维护对抽象对象的引用。这种结构使得代理模式不是很灵活,好处是职责专一。
  • ②、代理都是接口代理,真实对象不直接与用户交互,这部分职责是由代理对象来完成的,好处是在用户与真实对象之间多了 一个代理层,增加了设计的灵活性,可以在代理层做一些额外 的工作,比如权限控制,约束检查等。
  • ③、虽然代理模式也可以通过代理对象像装饰模式那样为真实对象增加职责,但代理模式的本意其实是为真实对象提供一种代理 以控制对真实对象的访问,更多体现的是一种授权机制。这样做的好处是真实对象的职责可以更加单一,内聚性更好,比如对数据库访问对象增加一个数据库访问代理对象,谁可以访问数据库的权限控制就交由代理对象来检查,而数据库访问则只需要负责好自己的数据库访问职责即可。
  • ④、具体proxy模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如copy-on- write技术,有些可能对组件模块提供抽象代理层,在架构层次对对象做proxy。
  • ⑤、Proxy并不一定要求保持接口的一致性,只要能够实现间接控制,有时损及一些透明性是可接受的。
朗读
赞 · 0
版权属于:

IT技术分享

本文链接:

https://idunso.com/archives/1875/(转载时请注明本文出处及文章链接)