设计模式-代理模式
概念:二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标
方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑
的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调
用和打扰,同时让附加功能能够集中在一起也有利于统一维护。
个人理解
为分离核心代码和非核心代码,创建一个代理类,
代理类中创建一个核心代码(核心功能)中的方法,
由代理类来间接调用核心代码中的方法,
再将非核心代码(附加功能)写在代理类中,
方便进行对附加功能进行统一维护
减少对核心功能的打扰
在通过代理模式进行功能增强的时,
不仅仅只有核心功能执行前后,
在catch,finally中都能增加附加功能


生活中的代理
广告商找大明星拍广告需要经过经纪人
合作伙伴找大老板谈合作要约见面时间需要经过秘书
房产中介是买卖双方的代理
相关术语
代理:将非核心逻辑剥离出来以后,封装这些非核心逻辑的类、对象、方法。
目标:被代理“套用”了非核心逻辑代码的类、对象、方法。
静态代理(一般不用)
静态代理确实实现了解耦,但是由于代码都写死了,完全不具备任何的灵活性。就拿日志功能来
说,将来其他地方也需要附加日志,那还得再声明更多个静态代理类,那就产生了大量重复的代
码,日志功能还是分散的,没有统一管理。
提出进一步的需求:将日志功能集中到一个代理类中,将来有任何日志需求,都通过这一个代理
类来实现。这就需要使用动态代理技术了。
动态代理
* 动态代理有两种(AOP底层用动态代理实现)
* 1.jdk动态代理:
* 要求必须有接口,最终生成的代理类和目标类实现相同的接口
* 在com.sun.proxy包下,类名为$proxy2
* 2.cglib动态代理
* 会继承目标类,并且和目标类在相同的包下
public Object getProxy(){
/**
* ClassLoader loader:
* 指定加载动态生成的代理类的类加载器,
* Class[] interfaces:
* 获取目标对象实现的所有的接口的class对象的数组
* InvocationHandler h:
* 设置代理类中的抽象方法如何重写
*/
ClassLoader classLoader = this.getClass().getClassLoader();
Class<?>[] interfaces = target.getClass().getInterfaces();
InvocationHandler h=new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try {
System.out.println("日志,方法"+method.getName()+",参数:"+ Arrays.toString(args));
//proxy表示代理对象,method表示要执行的方法,args表示要执行的方法的参数列表
result = method.invoke(target, args);
System.out.println("日志,方法"+method.getName()+",结果:"+ result);
} catch (Exception e) {
e.printStackTrace();
System.out.println("日志,方法"+method.getName()+",异常:"+ e);
} finally {
System.out.println("日志,方法"+method.getName()+",方法执行完毕");
}
return result;
}
};
return Proxy.newProxyInstance(classLoader,interfaces,h);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!