介绍
二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来一一解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。
静态代理
构建一个目标对象属性,再添加一个构造器,在方法中调用目标对象的方法实现核心业务。
(虽然实现了解耦,但是代码都写死了,不具备任何的灵活性,可重复性差,不便于管理)
动态代理代码实现
//先创建一个类,在类里面写个方法,让方法返回代理对象
public class ProxyFactory {
//目标对象
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
//返回代理对象
public Object getProxy(){
/**
*Proxy.newProxyInstance()方法
*有三个参数
*第一个参数:ClassLoader:加载动态生成代理类的来加载器
*第二个参数:interfaces:Class[]interfaces:目录对象实现的所有接口的class类型数组
*第三个参数:InvocationHandler:设置代理对象实现目标对象方法的过程
*/
//第一个参数:ClassLoader:加载动态生成代理类的来加载器
ClassLoader classLoader =target.getclass().getclassLoader();
//第二个参数:Class[]interfaces:目录对象实现的所有接口的class类型数组
Class<?>[]interfaces =target.getclass().getInterfaces();
//第三个参数:InvocationHandler:设置代理对象实现目标对象方法的过程
InvocationHandler invocationHandler =new InvocationHandler(){
//第一个参数:代理对象
//第二个参数:需要重写目标对象的方法
//第三个参数:method方法里面参数
@Override
public object invoke(object proxy,Method method,Object[] args)throws
Throwable {
//方法调用之前输出
System.out.println("[动态代理][日志]"+method.getName()+",参数:"+
Arrays.toString(args));
//调用目标的方法
Object result =method.invoke(target, args);
//方法调用之后输出
System.out.println("[动态代理][日志]"+method.getName()+",结果:"+
result);
return null;
}
};
return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
}