java设计模式----代理模式
一、代理模式介绍
代理模式(Proxy Pattern),是23种设计模式之一,它关心的主要是过程,而不是结果。代理模式主要提供了对目标对象的间接访问方式,即通过代理对象来访问目标对象,这样可以在目标对象实现的基础上,==增强额外的功能操作,即扩展目标对象的功能==,SpringAop便是一个很好的例子。而被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。代理模式的简单示意图如下。
代理模式主要有三种实现方式 静态代理、动态代理(JDK代理、接口代理)和Cglib代理(不需要实现接口)。
二、三种代理模式的简单介绍
1、静态代理
1、介绍
静态代理UML类图如下图,StudentDaoProxy类是代理类,通过聚合的方式代理StudentDao类,同时StudentDao类和代理类都实现IStudentDao接口类。
静态代理的优点是能够较为简单快速的在不修改目标对象的前提下,对目标对象功能进行扩展;而缺点就是不够灵活,如果接口新增方法,那么需要维护类的成本太大。
2、代码实现
①新建IStudentDao接口类
1 | public interface IStudentDao { |
②被代理的学生类
1 | public class StudentDao implements IStudentDao{ |
③创建代理类
1 | public class StudentDaoProxy implements IStudentDao{ |
④用户测试类
1 | public class Client { |
输出结果
1 | 打开书本。。。。。 |
2、动态代理
1、介绍
动态代理对象不需要实现接口,但是目标对象还是需要实现接口。而代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象,相比于静态代理灵活的多,所以也叫JDK代理或接口代理。其UML类图如下
2、代码实现
①新建IStudentDao接口类
1 | public interface IStudentDao { |
②被代理的学生类
1 | public class StudentDao implements IStudentDao{ |
③创建代理类
这里相比静态代理有点小修改,JDK代理需要使用newProxyInstance
方法,其完整写法是static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandlerh)
,该方法在java.lang.reflect.Proxy
包内,通过反射机制实现。
1 | public class ProxyFactory{ |
④用户测试类
1 | public class Client { |
结果
1 | JDK代理开始~~ |
3、Cglib代理
1、介绍
- 动态代理或静态代理都要求实现一个接口,但是对于Cglib并不需要实现任何接口。
- Cglib代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展,所以也可称为动态代理。
- Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口。它广泛的被许多AOP框架使用,例如SpringAOP,实现方法拦截。
- 在AOP编程中如何选择代理模式:
1.目标对象需要实现接口,用JDK代理
2.目标对象不需要实现接口,用Cglib代理 - Cglib包的底层是通过使用字节码处理框架ASM来转换字节码并生成新的类
2、代码实现
使用Cglib时代理的类不能为final/static,否则不会被拦截,同时需要引入cglib相关jar包
链接:https://pan.baidu.com/s/1ydin81D5ueuIm2cbSXSnIw
提取码:b5au
①被代理的学生类
1 | public class StudentDao implements IStudentDao{ |
②创建代理类
1 | public class ProxyFactory implements MethodInterceptor{ |
③用户测试类
1 | public class Client { |
结果
1 | Cglib代理模式 ~~ 开始 |