注:学习设计模式,不要老是看下面这些干巴巴的文字,要看UML图,UML图,UML图,再敲代码,敲代码,敲代码。
代理模式是什么?
代理模式是相对工厂模式、建造器模式比较简单的,简而言之,形象解释:代理模式就是找个中间商,找个中介,在保护目标对象的同时,扩展目标对象的功能。(java解释:在不改变源码的情况下,实现对目标对象的功能扩展。)比如说一个歌手,她就是负责唱歌,有时候需要与歌手互动,或者公布相关行程活动,这个时候歌手(目标对象)忙不过来,怎么办,那就找个经纪人(代理对象),需要唱歌的时候,经纪人对歌手说,你去唱歌吧,需要公布行程的时候,经纪人自己把这个事干了,这就是代理模式,公布行程是额外添加的功能。
代理模式应用场景:
这些场景不要单纯死记硬背,随着技术的提高,会慢慢理解的。
- 远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。
- 虚拟代理,这种方式通常用于要创建的目标对象开销很大时。例如,下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的对象,消除用户对服务器慢的感觉。这个其实就是我们在下载大文件的时候,不能在短时间内下载完毕的时候,我们看到的提示:正在下载中。。。,这种方式对用户更友好。
- 安全代理,这种方式通常用于控制不同种类客户对真实对象的访问权限。
- 智能指引,主要用于调用目标对象时,代理附加一些额外的处理功能。例如,增加计算真实对象的引用次数的功能,这样当该对象没有被引用时,就可以自动释放它。
- 延迟加载,指为了提高系统的性能,延迟对目标的加载。例如,Hibernate 中就存在属性的延迟加载和关联表的延时加载。
java代理模式有三种:静态代理、动态代理以及Cglib代理。
静态代理:通俗理解:代理者和代理对象之间是预先确定的。比如,歌手和经纪人之间的往往是预先签了合同的,是长期合作的关系,在java映射到编程领域为这个关系是在编译时确定的。
动态代理:通俗理解:代理者是个临时工,和代理对象之间的关系是临时确定的,比如歌手的签约经纪人生病了,临时找了个经纪人干活,这个过程就是动态代理。映射到编程领域为这个关系是在运行时确定的。
Cglib代理:由于JDK只能针对实现了接口的类做动态代理,而不能对没有实现接口的类做动态代理,所以cgLib横空出世!CGLib(Code Generation Library)是一个强大、高性能的Code生成类库,它可以在程序运行期间动态扩展类或接口,它的底层是使用java字节码操作框架ASM实现。
静态代理比动态代理更符合OOP原则,在日常开发中使用也较多。动态代理在开发框架时使用较多,例如大名鼎鼎的Spring
。
上述三种模式的优缺点:
静态代理:缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护;代理对象必须提前写出,如果接口层发生了变化,代理对象的代码也要进行维护。如果能在运行时动态地写出代理对象,不但减少了一大批代理类的代码,也少了不断维护的烦恼,不过运行时的效率必定受到影响。这种方式就是接下来的动态代理。
动态代理:
特点:
1.代理对象,不需要实现接口
2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
3.动态代理也叫做:JDK代理,接口代理
缺点:目标对象必须实现一个或多个接口,假如没有,则可以使用Cglib代理。
参考博文:https://www.cnblogs.com/boboxing/p/8126046.html(理解java代理的三种模式)
https://blog.csdn.net/ShuSheng0007/article/details/80864854 (秒懂Java代理与动态代理模式)(比较形象)
https://blog.csdn.net/lixiaoxiong55/article/details/81712442(java的三种代理模式)
https://www.cnblogs.com/lfdingye/p/7717063.html(JAVA设计模式之动态代理)