代理模式:
二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,
不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来一—解耦。
调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。
(简而言之,是为目标对象创建代理对象,访问目标对象通过代理对象访问,在代理对象控制目标对象实现的功能,我们可以在代理对象中在目标对象实现上加入一些额外功能的操作)
静态代理:大致思路,创建一个类继承目标对象的方法,重写,之后在重写之上创建private 目标对象 自己取名;创建有参构造
(一对一,代码写死,不具备灵活性,出现大量重复代码)(了解即可)
动态代理
(jdk模板)(必须有接口,最终生成代理类在com.sun.proxy包下,类名为$proxy2且其和目标类实现相同的接口):
public class ProxyFactory {
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxy() {
/**
* cLassLoader loader:指定加载动态生成的代理类的类加载器
* cLass[] interfaces:获取目标对象实现的所有接口的cLass对象的数组
* InvocationHandler h:设置代理类中的抽象方法如何重写
*/
ClassLoader classLoader = this.getClass().getClassLoader();
Class<?>[] interfaces = target.getClass().getInterfaces();
InvocationHandler h = new InvocationHandler() {
//proxy表示代理对象,method表示要执行的方法,args表示要执行的方法到的参数列表
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//此处添加额外的操作
Object result = method.invoke(target, args);
return result;
}
};
return Proxy.newProxyInstance(classLoader,interfaces,h);
}
}
调用:假如有一个Calculator接口及其实现类
proxyFactory proxyFactory = new ProxyFactory(new calculatorImpl());
//向上转型获取类型
calculator proxy = (calculator) proxyFactory.getProxy();
proxy. add( i: 1, j: 2);
(cglib动态代理,最终生成的代理类会继承目标类并和目标类在相同包下)
网友评论