代理模式
本文仅用作笔记,如有侵权,请告知
01 概述
Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。
静态代理代理类在编译期就生成,而动态代理代理类则是在Java运行时动态生成。
动态代理又有JDK代理和CGLib代理两种。
02 结构
代理(Proxy)模式分为三种角色:
抽象主题(Subject)类: 通过接口或抽象类声明真实主题和代理对象实现的业务方法。
真实主题(Real Subject)类: 实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
代理(Proxy)类 : 提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
03 静态代理
04 jdk动态代理
05 cglib动态代理
06 三种代理的对比
jdk代理和CGLIB代理
CGLib使用字节码技术生成代理类,在JDK1.6之前比java反射效率高,到jdk1.8的时候jdk的代理效率高于cglib代理
cglib不能对生命为final的类或者方法进行代理,因为cglib的原理是动态生成被代理类的子类
jdk基于接口
动态代理和静态代理
动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler.invoke)
当接口方法数量比较多的,静态代理需要对每个方法进行中转,增加了代码的维护难度
07 优缺点
优点:
代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
代理对象可以扩展目标对象的功能;
代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度;
缺点:
-
增加了系统的复杂度;
08 使用场景
远程(Remote)代理
本地服务通过网络请求远程服务。为了实现本地到远程的通信,我们需要实现网络通信,处理其中可能的异常。为良好的代码设计和可维护性,我们将网络通信部分隐藏起来,只暴露给本地服务一个接口,通过该接口即可访问远程服务提供的功能,而不必过多关心通信部分的细节。
防火墙(Firewall)代理
当你将浏览器配置成使用代理功能时,防火墙就将你的浏览器的请求转给互联网;当互联网返回响应时,代理服务器再把它转给你的浏览器。
保护(Protect or Access)代理