代理模式
GOF概括:为其他对象提供一种代理以控制对这个对象的访问。
代理模式会伴随着程序员走过整个职业生涯,会见到无数这样的代码。
简单地说,就是一个对象,要做某件事情,做这件事之前,要做什么?做完之后,要做什么?异常时,要做什么?
对于这样的需求,就可以使用代理模式。
案例
举个例子:我们要做一件事情,做这件事情需要记录日志。
完成这件事情,我们要写一份代码;写日志,也要写一份代码。
两份代码功能不同,不可能写在同一个类,这时候,我们就可以使用代理模式来做。
interface Action {
void run();
}
class Hit implements Action {
@Override
public void run() {
// do sth.
}
}
class ProxyHit implements Action {
private Hit hit = new Hit();
@Override
public void run() {
// before do sth.
try {
hit.run();
} catch (Exception e) {
// when exception, do sth.
}
// after do sth.
}
}
JDK代理的写法
学习阶段,不要刻意寻找难题,不是很推荐学习 JDK 和 CGLIB 的代理,
如果不从事框架搭建工作,工作前几年大概率是用不上的。
代理模式有滥用的现象:业务代码,就是越简单越好,不要为了使用代理模式,而把代码搞得很复杂。
JDK代理类 invoke() 的 3 个参数:
proxy:被代理对象,正常用不到它,随便调用,很容易会出现死循环;
method:Method对象,也就是被代理的函数(不懂的话,要先了解 Java 反射);
args:调用方法时候,输入的参数。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Action {
void run();
}
class Hit implements Action {
@Override
public void run() {
// do sth.
}
}
class ProxyHit implements InvocationHandler {
private Hit hit;
public ProxyHit(Hit hit) {
this.hit = hit;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("".equals(method.getName())) {
// before do sth.
try {
Object ret = method.invoke(hit, args);
} catch (Exception e) {
// when exception, do sth.
throw e;
}
// after do sth.
} else {
return method.invoke(hit, args);
}
}
}
public class Test2 {
public static void main(String[] args) {
Hit hit = new Hit();
Hit proxy = (Hit) Proxy.newProxyInstance(Action.class.getClassLoader(),
Hit.class.getInterfaces(), new ProxyHit(hit));
proxy.run();
}
}
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY