https://blog.csdn.net/briblue/article/details/73928350 基于此篇博客整理的感悟,再次多谢大佬
看retrofit,看到了动态代理,并没有实际是使用。目前只是基于上述博客整理,之后有新的感悟会更新 。。。
有大佬看了有什么不对的请多指正,愿意献上膝盖
代码中的代理:使用共同的接口实现功能的增强。基于开放封闭原则,新增是允许的,修改是不允许的。
静态代理
要有一个接口作为功能实现 (电影播放 )
实例 实现电影播放的接口 (电影)
代理类 实现电影播放的接口(电影院) 电影院接收电影实例,在自己的接口方法实现实例的接口方法,可以加入自己的需要的功能(播广告)
实现: 实例化真实的实例类,实例化代理类传入实例对象(由接口接收)并且实现接口的功能即可
代理类实现了接口的功能,在不修改实例的情况下,可以进行功能的增强。
这符合封闭开放原则,(增强了功能的实现,却不修改之前的代码,只是增加了代码,提高了复用率)
问题:如果我们想实现新的功能呢,肯定会有一个新的接口,对应写一个新的代理类(不能修改之前的代码)
动态代理
原理和静态代理是一样的,代理类和实力类实现相同的功能,但是动态代理类不需要自己在预先写代理类了,只是通过代码反射生成代理类来实现对应实现的功能。
要有一个接口作为功能实现 (电影播放 )
实例实现电影播放的接口 (电影)
一个实现了 InvocationHandler接口的类 同样要接收实例类,并且 在其invoke方法中实现类似代理类需要实现的功能增强
实现: 实例化真实的实例类,实例化实现 InvocationHandler接口的类并传入实例的类,通过 Proxy 的静态方法 newProxyInstance 才会动态创建代理类(由接口接收),执行接口的方法。
newProxyInstance 方法的三个参数 实例类的类加载器,功能的接口,实现InvocationHandler接口的类。
所以如果想要增加新的功能实现,这个时候只需要写新的接口以及实例类,还是用之前的实现InvocationHandler接口的类即可
此时动态生成的代理类是对应接口的,一个接口一个类,类在内存中
网友评论