发表于: 2017-09-06 23:15:49
4 937
一、 今天完成的事情
1) 设计模式——代理模式
1) 概述
代理模式是指,为其它对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象的访问,而代理对象可以在客户类和目标对象之间起到中介的作用。
也就是说,使用代理对象,是为了在不修改目标对象的基础上,增强主业务逻辑。
客户类真正想要访问的对象是目标对象,但客户类真正可以访问的对象是代理对象。
打个比方:打官司时一般人会请律师来辩护,这里律师便是代理对象,人则是目标对象。
根据代理关系建立的时间不同,代理分为两类:静态代理和动态代理。
2) 静态代理
静态代理是指,代理类在程序运行前就定义好的。
现有目标类SomeServiceImpl:
SomeServiceImpl类实现了SomeService接口,现在我们需要改造它的doFirst方法,要求不再原来的方法上进行更改,这时可以使用静态代理。
重新编写一个代理类SomeServiceProxy,这个代理类要实现代理模式有如下要求:
目标对象与代理对象实现同一接口或继承同一个类;
代理对象中要有目标对象的引用;
对需要改造的方法进行改造,对不需要改造的方法则调用原来的。
以下是实现代码:
观察代码可以发现,ISomerService为同一接口,通过无参构造函数获取了引用,对doFirst进行了改造,doSecond方法则调用原来的,符合上述的要求。
3) 动态代理——通过jdk实现
动态代理是指,目标对象的代理对象是临时生成的,其代理类与目标类的关系再程序运行时才确立。
依旧是刚才的问题,这次使用动态代理来解决。
使用JDK的proxy动态代理,要求目标类必须实现接口(ISomeService接口)
以下是代码实现:
4) 动态代理——通过cglib实现
通过jdk的动态代理要求目标对象必须有实现的接口,那么对于没有实现接口的目标类呢?
答:通过cglib实现。
首先,代理对象中要有目标对象的引用
其次,定义代理的生成方法,返回:目标对象类型
最后,要有回调函数提供给Enhancer类调用,在回调函数里面改造方法:
二、 明天计划的事情
1)调整好状态,学习
三、 遇到的问题
1)明天要回校了,今天一直在收拾东西,状态不佳
四、 收获
1)总算有点弄懂了代理模式
评论