我们先用房东出租房子引出代理模式
出租一套房子流程为:
发布出租消息->带人看房->准备合同->签合同->收钱交钥匙
如果租房出新规,需要提前备案,那就变成了以下的流程:
备案->发布出租消息->带人看房->准备合同->签合同->收钱交钥匙
每一次的变动房东都需要了解最新的规定,但是房东不想这么麻烦,那就把自己不内行的事给专业的中介做,需要签合同的时候过去下就好了,这样房东就不要关注出租的细节了,只要专注签合同就可以了,无论租房流程怎么变,和房东没关系了。
这里房东是真实对象,中介就是代理
代理模式的好处有以下几个
1.独立业务与公共业务拆开
2.公共业务扩展集中管理
1.传统代码
缺点:一旦有调整,原始业务类就要全部做修改,风险太大
2.静态代理
静态代理的规范是:真实类和代理类继承相同接口
优点:独立业务和公共业务拆封了,如果公共业务有变化,不会修改独立业务,独立业务更专注
缺点:一个独立业务类就要有一个代理类,虽然业务清晰了,但是代码量上升了
3.动态代理
静态代理的缺点是每个类都是继承同一接口,每出现一个新的接口就要实现一个新的代理类,怎么样才能不用每次生成一个代理类,那就涉及到动态代理
动态代理分为两种模式
1.jdk代理模式:拿到类结构,复制出和原对象一样的结构,调用代理的方法时,利用反射,调用真实对象的方法。
2.cglib代理:拿到类的字节码,直接改变字节码来增强原来的方法,然后生成一个子类
3.1 jdk动态代理:
但是你会发现上面的动态代理其实还是只能处理指定类,随便换一个就不能用了
所以需要使用Object类型
3.2 cglib代理
4.总结
jdk和cglib动态代理两种模式怎么可以直观的看呢
这里可以看出jdk模式下产生代理对象就是一个代理
而cgi模式下还是一个原类型,只是做了增强。