1、代理模式的相关概念
代理模式:
有时候,用于控制对实际对象的访问,通常把这层访问控制封装程一个新的代理对象来替代实际对象,交由客户对象直接返回,因此引入代理模式
优点:
- 可以在目标对象实现的基础上,增强额外的功能操作,即拓展目标对象的功能。
- 被代理的对象可以是远程对象、创建开销大的对象或者需要安全控制的对象 。
代理模式主要有三种:静态代理
、动态代理(JDK代理)
、Cglib代理
2、静态代理
使用静态代理需要定义接口或者父类,即被代理对象(目标对象)与代理对象一起实现相同的接口或者是继承相同的父类。
缺点:代理对象需要和目标对象实现一样的接口,所以会有很多代理类出现,同时一旦接口增加方法,目标对象和代理对象都需要维护。
步骤:
- 定义一个接口
- 目标对象
- 使用静态代理方式,需要在代理对象中也实现相同的接口
- 调用的时候调用代理对象的方法来调用目标对象
注意:代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法
定义接口:
public inteface Work {
void work();
}
目标对象:
public Worker implements Work{
@Override
public void work(){
System.out.println("正在工作中……");
}
}
代理类(静态代理):
public class WorkerProxy implements Work{
private Work target; // 目标对象,通过接口来聚合
public void setTarget(Work target){
this.target= target;
}
@Override
public void work(){
System.out.println("开始代理前");
target.work();
System.out.println("代理结束");
}
}
测试:
public class TestStaticProxy{
public static void main(String args){
// 1.创建目标对象
Work worker = new Worker();
// 2.创建代理对象,同时将目标对象传给代理对象
WorkerProxy proxy = new WorkerProxy();
proxy.setTarget(worker);
// 3.通过代理对象调用目标对象方法
proxy.work();
}
}
3、JDK动态代理
原理:
代理对象不需要实现接口,但是目标对象需要实现接口,否则不能用JDK动态代理
使用到的API:
-
java.lang.reflect.Proxy
类 -
java.lang.reflect.InvocationHandler
接口 -
public static Class<?> getProxyClass(ClassLoader loader, Class<?> [] interfaces, InvocationHandlder handler)
方法
步骤:
- 需要创建一个接口
- 创建一