Java技术常用设计模式(二)--- 代理模式
2017-08-17 16:23
429 查看
1 代理模式概述
在我们的生活中,有很多普通而又可敬的建筑工人,他们自己有技术,却没有机会随便参与一个项目中去;这时候他们往往会去找也是搞建筑的包工头,包工头手上有很多活可以分派给工人去做。这个过程中包工头就相当于是代理类,主要就是接活;
建筑工人就相当于是被代理类,他们负责实际工作的完成。
被代理类和代理类都要实现一个同样的接口;就像上述例子中包工头和建筑工人都要是搞建筑这一行的,这样就能保证包工头接的活,下面的人都能完成;而下面的人接到的任务一定是建筑相关的,能够保证完成。
为每个RealSubject实际对象提供一个代理类,代理的外部功能和实际对象一般是一样的,用户与代理打交道,不直接接触实际对象(即被代理类)。
2 代理模式结构图
组成:
- Subject类 : 定义了RealSubject 和 Proxy 的共用接口,这样就在任何使用RealSubject 的地方都可以使用Proxy。
- RealSubject 类:定义Proxy所代表的真实实体,负责完成具体的工作;
- Proxy类:保存一个引用来访问实体类RealSubject ,同时提供一个与Subject的接口相同的接口。
3 动态代理
代理模式应用最多的应该就是动态代理了。动态代理可以在运行时动态地创建一个类,这个类实现一个或多个接口,在不修改原有类的基础上动态地为该类获取的对象添加方法,修改行为。
动态代理实现的两种方式及代码实现参看:
http://blog.csdn.net/noaman_wgs/article/details/72810255
4 Spring 中代理模式的实现
Spring AOP 中的JDK动态代理就是利用代理模式技术实现的。
最上面除了抽象主题Subject外,还有SpringProxy 和 Advised两个接口。
$Proxy 就是创建的代理对象;
而RealSubejct是被代理对象,
$Proxy 通过InvocationHandler 来保持对被代理对象的引用。
在AOP的实现过程中:
Spring首先创建代理对象,然后当你调用目标对象的方法时,都会被代理到InvovationHandler的invoke方法中去执行。
1)首先利用策略模式,根据目标对象是类还是接口,AopProxyFactory选择是使用JDK代理方式 还是 CGLIB方式来生成代理对象;
2)获取目标对象方法上的拦截器链(Intercetors),即我们在一个切面中定义的通知(Advice);
3)当目标方法被调用时,首先会遍历拦截器链。若调用的方法与拦截器匹配,则对拦截器进行调用,调用结束后才对目标对象方法进行调用,完成对目标对象方法的增强。
调用过程用的即是动态代理过程:
- JDK动态代理通过invoke()方法完成对目标方法的回调,并织入横切逻辑;
- Cglib通过intercept()方法拦截父类方法调用,织入横切逻辑后,再利用Enhancer类的setCallback()方法完成回调。
相关文章推荐
- Java技术常用设计模式(八)--- 适配器模式
- Java常用GoF设计模式之一代理模式
- 11. JAVA常用类库 Part 4 (对象克隆技术clone、Arrays类、Comparable接口、比较器Comparator、观察者设计模式) ----- 学习笔记
- Java技术常用的设计模式(一)--- 策略模式
- Java技术常用设计模式(六)--- 职责链模式
- Java技术常用设计模式(五)--- 观察者模式
- 六种常用的设计模式java实现(五)代理模式
- Java技术常用设计模式(四)--- 工厂模式
- Java 常用设计模式-代理模式Proxy
- Java技术常用设计模式(三)--- 模板方法模式
- Java常用的设计模式11:常用设计模式之代理模式(结构型模式)
- Java技术常用设计模式(七)--- 装饰模式
- java 23种常用设计模式之代理模式(Proxy)
- Java设计模式-----Proxy模式(静态代理)
- java GOF设计模式--------------代理模式(Proxy Pattern)
- [转]转个经典的帖子:说故事学设计模式之-Java动态代理模式
- NET常用设计模式——代理(Proxy)模式
- Java设计模式:单态模式,工厂模式,代理模式,观察者模式示例
- 深入浅出基于Java的代理设计模式
- Java设计模式-----Proxy模式(动态代理)