代理模式这种机制可以叫做AOP,在不改变原有代码的基础上,添加或者删除某些方法
例如:
要调用某个jar包中某个类的方法,但是不能改变源码,我们可以采用JDK的动态代理模式,在该方法的前后添加业务逻辑,如记录日志,权限控制等
image.png
概念:为其他对象提供一种代理,以控制对这个对象的访问(例如火车站代售处)。代理对象起到中介作用,可去掉功能服务或增加额外的服务。
几种场景的代理模式:智能引用代理使用的场景最多
![](https://img.haomeiwen.com/i11382761/0285820ac8669cd9.png)
a、远程代理---为不同地理的对象提供局域网代表对象。(类似于客户端和服务器端)
比如:通过远程代理来监控各个店铺的运营情况
![](https://img.haomeiwen.com/i11382761/48beb82b700beacf.png)
b.虚拟代理---根据需要将资源消耗很大的对象进行延迟,真正需要的时候才进行创建。
比如:网页中 图片的加载,先用一张虚拟的图片进行显示,等图片加载完成后再进行显示
![](https://img.haomeiwen.com/i11382761/d0b4b8729a73236d.png)
c.保护代理---控制对象(用户)的访问权限。
比如:用户贴吧的浏览权限,发帖权限,评论权限等等都需要注册才能操作,权限的控制通过保护代理来实现。
![](https://img.haomeiwen.com/i11382761/e2541e447ad173f1.png)
d.智能应用代理---提供对目标对象一些额外的服务。
比如:火车站代售处
![](https://img.haomeiwen.com/i11382761/2252e8eea5ebd7b3.png)
两种实现方式
一、静态代理
1、静态代理:代理和被代理对象在【代理之前】都是【确定】的。他们都实现【相同的接口或者继承相同的抽象类】
(1)继承法:代理类直接【继承】被代理类,实现其原有方法,并添加一些额外功能
![](https://img.haomeiwen.com/i11382761/2e70f9084df5feaf.png)
(2)聚合方法:代理类实现【相同的功能接口:很重要,事项相同接口,不同代理也可以进行相互代理】,并在内声明一个被代理类的对象(类似封装),通过内部对象实现其原有方法,并添加额外功能
![](https://img.haomeiwen.com/i11382761/0d84412098170ad7.png)
![](https://img.haomeiwen.com/i11382761/1542f3d8f75993ee.png)
![](https://img.haomeiwen.com/i11382761/ed357c3698e1de87.png)
1.聚合代理优于继承代理。
在实现功能叠加的情况下,聚合代理通过相互代理可以实现功能重用,而继承代理必须写多个类来实现多功能叠加。
2.但静态代理只能代理一种类型的被代理类,换个类型的就不行了,这需要动态代理
项目实践1:DefaultHttpProxy / HttpProxy
项目实践2:image.png
动态代理:JDK、cglib
动态代理-JDK的动态代理(日志处理)
目的:动态产生代理,实现对【不同类】,【不同方法】的代理
![](https://img.haomeiwen.com/i11382761/86330b537c07f12f.png)
动态代理实现步骤:
- 创建一个实现接口 Invocation Handlerg 的类,它必须实现 invoke 方法
- 创建被代理的类以及接口
- 调用 Proxy 的静态方法,创建一个代理类
newproxyinstance (Classloader loader, Classl
interfaces, Invocationhandler h) - 通过代理调用方法
项目实践:多个支付方式的支付服务模块实现
项目中使用多个支付公司:易宝,汇潮,连连,等等,并且,每个支付公司需要请求多个支付接口(请求支付,查询,回调)。
将每个支付公司的每个支付接口的业务逻辑单独放在一个Hander
(YeePayPayQueryHandler)
通过抽象支付服务代理处理器,找到对应需要请求的支付公司接口的Hander
image.png
CDK动态代理和CGLIB代理的区别:
![](https://img.haomeiwen.com/i11382761/1bb2b96eadecae71.png)
动态代理-CGLIB的动态代理
class CglibProxy implements MethodInterceptor
实现 intercept(Object obj,Method m,Object[] args,MethodProxy proxy);方法
项目中的实践:分布式锁的实现
![](https://img.haomeiwen.com/i11382761/58f595a892983291.png)
网友评论