您的位置:首页 > 编程语言 > Java开发

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()方法完成回调。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: