Java设计模式——代理模式(proxy)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012736913/article/details/87072343

代理模式(proxy)还是挺难理解的。为了能够清晰的了解它的原理,我看了好几遍。。。以下为学习总结

*****************************************************************************************************************

proxy应用的场景:为其他的对象提供一种代理,以控制对该对象的访问。eg. 房屋中介、婚介所、快递等

代理的目的是拿到目标对象的引用,并调用目标类的业务方法。

代码中dynamic proxy的体现为JDK中的Proxy类和cglib(后续)

一、代理的分类(静态代理和动态代理)

(一)静态代理(static proxy):将目标对象作为代理对象的一个成员变量的引用,代理对象方法中调用目标对象的业务方法。调用者通过调用代理对象的方法而调用成员目标对象的业务方法。

优点:符合open-close原则

缺点:如果目标类发生变化,则所有的代理类都需要改动——>增加代码的复杂度,维护成本较高

(二)动态代理(dynamic proxy)

1、JDK :用到了java.lang.reflect.Proxy(创建代理类)和InvocationHandler (调用方法)

备注:若想看到$Proxy0的内容:获得JDK动态代理生成类$Proxy0的内容

(1)Proxy.newProxyInstance的3个参数、返回值:

(2)重写的InvocationHandler的invoke()的3个参数和返回值:

proxy - 在其上调用方法的代理实例

method - 对应于在代理实例上调用的接口方法的 Method 实例

args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null

2、cglib (code generation library):代码生成类库,包含2个jar(cglib.jar 、asm.jar)

-------------纠正:Enhance 写错了,应该改为Enhancer

(三)静态代理与动态代理的区别

    1、 静态代理:在代理之前,所有的东西都是已知的(代理已知的代码)

          动态代理:在代理之前,所有东西都是未知的(代理未知的代码) 

   2、目标类若改动(比如增加一个方法),静态代理的所有代理都需要改动,动态代理的代理无须进行改动

猜你喜欢

转载自blog.csdn.net/u012736913/article/details/87072343
今日推荐