美文网首页
有关动态代理

有关动态代理

作者: 34sir | 来源:发表于2018-02-08 16:45 被阅读8次

    代理模式的作用

    方法的增强,不修改源码的情况下增强一些方法,在方法执行前后做任意事,解耦

    简单的比喻,就像房主(委托)和中介(受委托)的关系,中介替房主物色买家(方法执行前),房主签定卖房合约过户等(方法执行),中介替你完成余下的手续(方法执行后)。解耦之处在于:房主从头到尾只需要完成签合约,其他琐事交给中介。

    静态代理

    动态代理之前先理解静态代理。

    直接看代码:

    image

    LimbsShower:“动物”们统一实现的接口,“展示他们的肢体”

    image image

    以上实现鸡和鱼两种动物。

    image

    ShowerProxy:静态代理类

    代理模式的好处体现在图中1和2处,这两处你可以随意加上功能,恣意而为,已实现不对具体实现类进行修改的情况下对showLimbs方法的功能拓展,并且解耦。

    有过项目开发经验的同学肯定会发现,静态代理存在严重的弊端,不够灵活,房产中介只能负责房子相关的事,一旦需要代理的类变多,代理类就会相应的增多,比如说猎头这类中介,这样会导致代码量的几何式上涨,于是动态代理应运而生!

    动态代理

    以上用“动物”说明了静态代理的好处和弊端,接下来我们实现一组“图形”类,对比动态代理和静态代理。

    image

    GraphShower:图形类的实现类,“展示他们的边数”

    image image

    以上实现圆形和正方形两种图形类

    image

    ProxyHandler:本文主角,动态代理类。

    要点:实现InvocationHandler接口并重写invoke方法,Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this),通过反射机制获取到收代理的对象。图中1和2处与上文同理,恣意而为。

    以下为测试代码:

    image

    由上可知完成对“动物”和“图形”两类的代理只需ProxyHandler一个动态代理类即可,而如果要采用静态代理的方式,必须再实现一个诸如GraphShowerProxy的代理类专门代理“图形”类(文中没有实现)。两相对比,动态代理优势显而易见。

    demo地址:https://github.com/34sir/TrendsProxyDemo

    这里附上一个Retrofit的源码分析:http://bxbxbai.github.io/2015/12/13/retrofit2/,其重要的一个实现原理就是动态代理,当然其中还涉及到很多设计模式,有兴趣可以一起探讨。

    以上如有错误或者不足的地方,望不吝赐教。

    相关文章

      网友评论

          本文标题:有关动态代理

          本文链接:https://www.haomeiwen.com/subject/gcittftx.html