代理模式中,在客户端与对象之间增加了一个代理层。客户端在进行访问时候,不是直接访问对象,而是访问代理。代理模式是一种结构型的设计模式。通过代理模式,可以解决直接访问对象带来的一些问题,并且可以进行访问控制。
代理模式的实现中,代理类中依赖实体类,但两者共同实现相同的接口。代理类中对应接口中,会调用实体类的对应接口。听上去与装饰器的实现一样,是的,两者的实现基本上是相同的,只是使用意义上的侧重点不同。两者的区别,会在文末的总结中进行分析。
代理模式的应用场景比较广泛,跟“代理”两个字沾边的,一般都会涉及代理模式。比如火车票代售站,对于乘客来说,他不需要去真正的火车站,而通过代售点,就可以实现买票取票的功能。比如VPN,由于众所周知的原因,我们不能访问youtube,那么我们可以设置一个VPN,通过VPN进行访问。再比如说windows的快捷方式,也是一种代理。还有就是Spring的AOP。
代理模式从类型上来说分为两种,静态代理和动态代理。所谓静态代理,就是在编译期间就确定的代理关系,一般是一对一的。而动态代理,是一对多的代理关系,是在运行时态才能确定的代理关系。动态代理的原理比较复杂,本篇文章只简单介绍动态代理的使用,在下一篇文章中,会从原理和代码的层面,对动态代理做专门的解读。
以购买火车票为例。乘客(客户端)在购买火车票的时候,可以在代售点(代理类)进行购买(功能),而不需要花费很长的时间跑去火车站(真实类)进行购买(功能)。
以汽车(抽象)行驶为例子,我们要统计多种车型(原始实现类)通过某段距离的用时。在汽车行驶前,需要进行开始计时的操作(功能扩展)。汽车行驶后,要进行结束计时的操作(功能扩展)。
装饰器模式强调对于方法的加强,扩展的深度。打个比方,张无忌学习大挪移。装饰器模式,则增加其深度,从第3层境地学习到第4层境地,注重功能的加强。代理模式则是让其在学习大挪移之前,先学习一下九阳神功,两种武功能够有所联系。从看来,都是武功的增强,但是一个是深度,一个是广度。
|