定义:为其他对象提供一种代理以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。
类型:结构类模式
类图:
代理模式也叫做委托模式,它是一项基本设计技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应用中,代理模式可以提供非常好的访问控制,在一些著名开源软件中也经常见到它的身影,如Struts2的Form元素映射就采用了代理模式(准确的说是动态代理模式)。类图中的三个角色的定义
l Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。
l RealSubject 具体主题角色:也叫做被委托角色、被代理角色,它才是冤大头,是业务逻辑的具体执行者。
l Proxy 代理主题角色:也叫做委托类、代理类,它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。
实现代码:
public interface Subject { // 抽象主题,定义主要功能 publicvoid operate(); } |
public class RealSubject implements Subject{ // 具体主题 @Override publicvoid operate() { System.out.println("realsubject operatestarted......"); } } |
public class Proxy implements Subject{ // 代理类 private Subject subject; public Proxy(Subject subject) { this.subject = subject; }
@Override publicvoid operate() { System.out.println("before operate......"); subject.operate(); System.out.println("after operate......"); } } |
publicclass Client { publicstaticvoid main(String[] args) { Subject subject = new RealSubject(); Proxy proxy = new Proxy(subject); proxy.operate(); } } |
运行结果:
beforeoperate......
realsubject operate started......
afteroperate......
代理模式的优点
l 职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
l 高扩展性:具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱如来佛的手掌(接口),那我们的代理类完全就可以在不做任何修改的情况下使用。
l 智能化:动态代理。
应用场景
程序设计中也可使用代理模式来将由一系列无关逻辑组合在一起的代码进行解耦合,比如业务代码中的日志代码就可以在代理中进行。Spring的AOP就是典型的动态代理应用。
代理模式的应用形式
l 远程代理(Remote Proxy):可以隐藏一个对象存在于不同地址空间的事实。也使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
l 虚拟代理(Virtual Proxy):允许内存开销较大的对象在需要的时候创建。只有我们真正需要这个对象的时候才创建。
l 写入时复制代理(Copy-On-Write Proxy):用来控制对象的复制,方法是延迟对象的复制,直到客户真的需要为止。是虚拟代理的一个变体。
l 保护代理(Protection (Access)Proxy):为不同的客户提供不同级别的目标对象访问权限
l 缓存代理(Cache Proxy):为开销大的运算结果提供暂时存储,它允许多个客户共享结果,以减少计算或网络延迟。
l 防火墙代理(Firewall Proxy):控制网络资源的访问,保护主题免于恶意客户的侵害。
l 同步代理(SynchronizationProxy):在多线程的情况下为主题提供安全的访问。
l 智能引用代理(Smart ReferenceProxy):当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
l 复杂隐藏代理(Complexity HidingProxy):用来隐藏一个类的复杂集合的复杂度,并进行访问控制。有时候也称为外观代理(Fa?adeProxy),这不难理解。复杂隐藏代理和外观模式是不一样的,因为代理控制访问,而外观模式是不一样的,因为代理控制访问,而外观模式只提供另一组接口。
原文地址:http://blog.csdn.net/derrantcm/article/details/46513625