打败自己的从来不是困难,而是懒惰!!!
1.代理模式介绍
高级讲法:代理模式是一种设计模式,为对象提供替身,以控制对这个对象的访问;
说实在,看完这个脑子退化二十年,只能说-------抽象啊!!!
简单的说:代理模式就是客户想要实现新的功能,如果直接在业务代码中改动耗材耗力,所以我们就找到代理,让他帮我们实现这个功能,到时候只需要调用这个代理就能实现新的功能;
举例:
汽车制造商生产出来的车要卖出去,不可能直接卖到我们手里,肯定是先找到4s店或者专卖店,再卖给我们,4s店和专卖店就是我们说的代理。
1.1两种代理模式
代理模式:可分为静态代理和动态代理,动态代理又有JDK动态代理和Cglib动态代理,但本文以JDK动态代理为例说明;
静态代理和动态代理的区别:静态代理的编译期是确定的,但是动态代理是在运行期才能确定的;
2.两种代理举例
2.1静态代理
我们首先看一下没有使用代理功能时,我们如果要实现一个日志功能,那么我们就需要在实现类中的每个方法都添加一个日志 ,这就违背了我们设计的OCP原则--也就是对扩展开放,对修改闭合!
实现类(通过写接口,实现类实现接口中的方法)
2.2静态代理实现日志功能
我们先看一张静态代理实现日志功能的类图
一眼下去把我自己干懵逼了,不过,保持耐心,跟着思路,待会就明白咯!
某天,有一个曾经的客户找上门了,说我们以前给他们做的保存客户的功能模块用起来不够爽,还想要再来一个日志功能,能够记录做了什么事情!!!
那么你会怎么做?该原本业务层的代码???这绝对是不可行的!!!
所以我们选择找一个代理类实现这个功能
代理类:在代理类中我们也需要重新实现业务中的方法
而日志功能我们也只需要向其他业务类一样创捷接口与实现类咯
那么此时此刻我们再回到前面的类图进行分析!!!
代码的随着客户的需求改变而改变,但是我们不可能每次都在原有代码上再进行大的改动;毕竟我们都看过那个形象的公告,一个人把其中的一颗不同颜色的小豆子拿掉后,就开始崩塌了;
所以此时此刻,我们就创建一个用户代理类(UserServiceProxy)把原本的功能方法实现,并且增加上新的功能--也就是日志功能;
将来我们就可以通过用户代理类实现原有的功能和新增的功能了;如果还需要其他的功能,那我们就再写一个实现类和接口再在用户代理类中调用就好;
2.3动态代理
静态代理之所以称之为静态代理,还是因为其不够灵活---假如你的用户有很多功能,比如,保存用户,删除用户,增加用户,那么我们在这个代理类中的这些实现方法中都需要加上日志的功能,工作量大大提升。
所以这时候就有了动态代理,无论我们有多少功能,我们都只需要写一次日志功能的代码,那么所有的功能也都增加上了这个功能。
动态代理又分为JDK动态代理和cglib动态代理,我们以JDK动态代理为例进行了解!
话不多说,上图!
好的,看完这张图,懵逼的我又懵逼上了……
JDK动态代理的第一步:写一个动态代理类去实现InvocationHandler接口,也就是下面的invoke方法,那么它是通过反射调用类对象,从而来实现动态代理!!!
然后我们就需要创建一个Object 的createProxyObject方法了,我们根据下一步的目标对象来生成一个代理对象tartgetObject,然后使用代理对象去做事情,也就是invoke();
前面说的根据目标对象就是这里的UserServiceImpl,然后代理对象调用目标方法(这里是通过反射得到的)
执行的顺序UserController-->UserServiceProxy-->UserServiceProxy-->UserServiceImpl
这里的执行顺序大家可以去写代码debug实现以下(打上断点,看看先跑哪个,更有益于理解动态代理)
2.4总结
看完了整篇文章,我想说的是,光看不写是搞不会的,看上去只能是懵逼状态,真正去写的时候你也会发现,其实也不是这么难!
分享自己的观点,如果能够对你有帮助,那我也能开心,保持耐心,去学习,进步是一定会来的!!!