Design Pattern 笔记 - 代理模式(Proxy Pattern)

一. 定义

代理模式(Proxy Pattern) :给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。代理模式的英 文叫做Proxy或Surrogate,它是一种对象结构型模式。

Proxy Pattern

二. 常用场景

1. 远程代理

为对象在不同的地址空间提供局部代表,比如远程方法调用(RMI)利用代理模式,使得在其他 JVM 中执行的对象就像本地对象一样;企业 JavaBeans (EJB)利用代理模式添加远程调用、安全性和事务分界;而 JAX-RPC Web 服务则用代理模式让远程服务表现得像本地对象一样。代理可以用来提供远程控制(就像在 RMI、EJB 和 JAX-RPC 中那样),用安全性策略包装对象(EJB)、为昂贵的对象(EJB 实体 Bean)提供惰性装入,或者添加检测工具(例如日志记录)。

2. 图片代理

一些网站或者程序中在显示图片列表时使用缩略图显示,只有在需要放大浏览或者下载时才访问真正的原图。

3. 保护代理

可以控制对一个对象的访问权限,为不同用户提供不同级别的使用权限

4. 虚拟代理

如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。比较典型的例子就是hibernate的延迟加载,Hibernate结合Javassist或CGLIB动态生成代理对象, 通过代理模式来“推迟”加载关联实体的时间,如果程序并不需要访问关联实体,那程序就不会去抓取关联实体。这样既可以节省系统的内存开销,也可以缩短 Hibernate 加载实体的时间。

5. 动态代理

比较典型的应用场景:

  1. 缓存系统
  2. spring AOP面向切面编程。
  3. Spring中的事务管理
  4. RMI在JDK 5后的版本也是使用动态代理生成stub对象。
  5. 单元测试中也使用动态代理来mock对象。

三. 优缺点

1. 优点

  1. 代理模式可以在一定程度上降低系统的耦合度,
  2. 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系 统资源的消耗,对系统进行优化并提高运行速度。
  3. 保护代理可以控制对真实对象的使用权限。
  4. 通过在代理对象中添加业务逻辑来实现对一些系统统一行为的定制和扩展,从而能够更灵活地处理对原有对象的控制和访问。

2. 缺点

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