代理模式的作用
方法的增强,不修改源码的情况下增强一些方法,在方法执行前后做任意事,解耦
简单的比喻,就像房主(委托)和中介(受委托)的关系,中介替房主物色买家(方法执行前),房主签定卖房合约过户等(方法执行),中介替你完成余下的手续(方法执行后)。解耦之处在于:房主从头到尾只需要完成签合约,其他琐事交给中介。
静态代理
动态代理之前先理解静态代理。
直接看代码:
LimbsShower:“动物”们统一实现的接口,“展示他们的肢体”
以上实现鸡和鱼两种动物。
ShowerProxy:静态代理类
代理模式的好处体现在图中1和2处,这两处你可以随意加上功能,恣意而为,已实现不对具体实现类进行修改的情况下对showLimbs方法的功能拓展,并且解耦。
有过项目开发经验的同学肯定会发现,静态代理存在严重的弊端,不够灵活,房产中介只能负责房子相关的事,一旦需要代理的类变多,代理类就会相应的增多,比如说猎头这类中介,这样会导致代码量的几何式上涨,于是动态代理应运而生!
动态代理
以上用“动物”说明了静态代理的好处和弊端,接下来我们实现一组“图形”类,对比动态代理和静态代理。
GraphShower:图形类的实现类,“展示他们的边数”
以上实现圆形和正方形两种图形类
ProxyHandler:本文主角,动态代理类。
要点:实现InvocationHandler接口并重写invoke方法,Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this),通过反射机制获取到收代理的对象。图中1和2处与上文同理,恣意而为。
以下为测试代码:
由上可知完成对“动物”和“图形”两类的代理只需ProxyHandler一个动态代理类即可,而如果要采用静态代理的方式,必须再实现一个诸如GraphShowerProxy的代理类专门代理“图形”类(文中没有实现)。两相对比,动态代理优势显而易见。
demo地址:https://github.com/34sir/TrendsProxyDemo
这里附上一个Retrofit的源码分析:http://bxbxbai.github.io/2015/12/13/retrofit2/,其重要的一个实现原理就是动态代理,当然其中还涉及到很多设计模式,有兴趣可以一起探讨。
以上如有错误或者不足的地方,望不吝赐教。