-
代理模式具体介绍
-
代替模式:为宇哥对象提供一个提升,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增加额外的功能操作,即扩展目标对象的功能
-
被代替的对象可以是远程对象、创建开销大的对象或者需要进行安全控制的对象
-
代理模式有三种不同的类型:静态代理、动态代理(JDK代理)、Cglib代理(特点可以在内存中动态的创建对象,而不需要实现接口,属于动态代理范畴)
-
代理模式类图
-
-
静态代理模式基本介绍
-
静态代理在使用时,需要定义接口或者父类,被代理的对象(即目标对象)与代理对象一起实现相同的接口或者继承相同的父类
-
案例
-
要求
-
定义一个接口IteacherDao
-
目标对象TeacherDao实现接口ITeacherDao
-
使用静态代理方式,就需要在代理对象TeacherDaoProxy中也实现接口IteacherDao
-
调用的时候通过调用代理对象的方法来调用目标对象
-
注意:代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法
-
-
静态代理类图
-
代码实现
//接口,代理对象和被代理对象都需要实现
public interface ITeacherDao{
public abstract void teach();
}
?
//创建被代理对象类
public class TeacherDao implements ITeacherDao{
-
代理对象的优缺点
-
优点:在不修改对象功能的前提下,能通过代理对象对目标功能扩展
-
缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类
-
一旦接口增加方法,目标对象与代理对象都需要维护
-
-
-
动态代理
-
介绍
-
代理对象,不需要实现接口,但是目标对象要实现接口,否则不能使用动态代理
-
代理对象的生成,是利用JDK的API,动态的在内部中构建代理对象
-
动态代理对象也叫作:JDK代理、接口代理
-
-
JDK中生成代理对象的API
-
代理类所在的包:java.lang.reflect.Proxy
-
JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是
static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,Invocationhandler h)
-
-
类图
-
代码实现
//接口,代理对象和被代理对象都需要实现
public interface ITeacherDao{
public abstract void teach();
public abstract void sayHello();
}
?
//创建被代理对象类
public class TeacherDao implements ITeacherDao{
-
优缺点
-
-
Cglib代理
-
基本介绍
-
静态代理模式和JDK代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可以使用目标对象子类来实现代理-这就是Cglib代理
-
Cglib代理也叫作子类代理,他是在内存中构建一个子类对象从而实现对目标对象功能的扩展
-
Cglib是一个强大的高性能的代码生成包,他可以在运行期间扩展java类与实现java接口。它广泛的被许多AOP框架使用,例如Spring AOP,实现方法拦截
-
在AOP 编程中如何选择代理模式
-
目标对象需要实现接口,使用JDK代理
-
目标对象不需要实现接口,使用Cglib代理
-
-
Cglib包的底层是通过使用字节码处理框架ASM来转换字节码并生成新的类
-
-
类图
-
代码
//注意需要引包
?
//创建被代理对象类
public class TeacherDao{
public void teach(){
System.out.println("开始上课了,我是Cglib不需要实现接口");
}
}
?
public class ProxyFactory implements MethodInterceptor{
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
//返回一个代理对象,是target的代理对象
public Object getProxyInstance(){
//1.创建一个工具类
Enhancer enhancer= new Enhancer();
//2.设置父类
enhancer.setSuperClass(target.getClass());
//3.设置回调函数
enhancer.setCallback(this);
//4.创建子类对象,即代理对象
return enhancer.create();
}
//会调用目标对象的相关方法
-
-
相关文章
- 01-05设计模式 笔记 中介者模式 Mediator
- 01-05【HeadFirst设计模式】13.与设计模式相处
- 01-05设计模式-组合模式
- 01-05设计模式之桥接模式
- 01-05简单工厂设计模式实现
- 01-058.代理模式
- 01-05设计模式之工厂模式Factory
- 01-05了解代理模式,以及jdk的代理模式与cglib的代理模式的区别
- 01-05设计模式总结篇系列:工厂方法模式(Factory Method)
- 01-05设计模式—门面模式