视频世界模型长期记忆突破:状态空间模型与注意力机制融合
2026/7/27 7:04:51
代理模式(Proxy Pattern)是一种结构型设计模式,它通过创建一个代理对象来控制对原始对象的访问。这种模式的核心思想是为其他对象提供一种代理,以控制对这个对象的访问。
你可以把它想象成生活中的"明星经纪人"系统:
在这个过程中,经纪人和明星都实现了相同的"能力接口"(比如"接受采访"、"商业演出"等),所以对外界来说,与经纪人沟通和与明星直接沟通,在接口上是一致的,但实际执行时经纪人可能会添加额外的处理。
代理模式主要包含三个核心角色:
Subject (抽象主题)
RealSubject (真实主题)
Proxy (代理)
代理模式的价值在于,它可以在不改变真实对象代码的前提下,为其增加额外的功能。这些功能通常是通用的、与核心业务无关的,例如:
远程代理 (Remote Proxy)
虚拟代理 (Virtual Proxy)
保护代理/安全代理 (Protection Proxy)
智能引用 (Smart Reference)
静态代理是在编译时就确定代理关系的代理方式:
实现步骤:
示例代码:
// 1. 定义接口interfaceImage{voiddisplay();}// 2. 真实对象classRealImageimplementsImage{privateStringfilename;publicRealImage(Stringfilename){this.filename=filename;loadFromDisk();}privatevoidloadFromDisk(){System.out.println("Loading "+filename);}publicvoiddisplay(){System.out.println("Displaying "+filename);}}// 3. 代理类classProxyImageimplementsImage{privateRealImagerealImage;privateStringfilename;publicProxyImage(Stringfilename){this.filename=filename;}publicvoiddisplay(){if(realImage==null){realImage=newRealImage(filename);// 延迟加载}System.out.println("Proxy doing some pre-processing");realImage.display();System.out.println("Proxy doing some post-processing");}}// 使用publicclassMain{publicstaticvoidmain(String[]args){Imageimage=newProxyImage("test.jpg");image.display();// 第一次会加载image.display();// 直接使用已加载的图片}}动态代理是在运行时动态生成代理类的代理方式:
Java提供的实现方式:
JDK动态代理:
java.lang.reflect.Proxy类和InvocationHandler接口// 1. 定义接口interfaceSubject{voidrequest();}// 2. 真实对象classRealSubjectimplementsSubject{publicvoidrequest(){System.out.println("RealSubject handling request");}}// 3. 实现InvocationHandlerclassDynamicProxyHandlerimplementsInvocationHandler{privateObjectrealSubject;publicDynamicProxyHandler(ObjectrealSubject){this.realSubject=realSubject;}publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println("Before calling "+method.getName());Objectresult=method.invoke(realSubject,args);System.out.println("After calling "+method.getName());returnresult;}}// 使用publicclassMain{publicstaticvoidmain(String[]args){RealSubjectreal=newRealSubject();Subjectproxy=(Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(),newClass[]{Subject.class},newDynamicProxyHandler(real));proxy.request();}}// 1. 真实对象(不需要实现接口)classRealSubject{publicvoidrequest(){System.out.println("RealSubject handling request");}}// 2. 实现MethodInterceptorclassCglibProxyimplementsMethodInterceptor{publicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{System.out.println("Before calling "+method.getName());Objectresult=proxy.invokeSuper(obj,args);System.out.println("After calling "+method.getName());returnresult;}}// 使用publicclassMain{publicstaticvoidmain(String[]args){Enhancerenhancer=newEnhancer();enhancer.setSuperclass(RealSubject.class);enhancer.setCallback(newCglibProxy());RealSubjectproxy=(RealSubject)enhancer.create();proxy.request();}}| 特性 | 静态代理 | 动态代理 |
|---|---|---|
| 创建时机 | 编译时 | 运行时 |
| 代理关系 | 固定 | 灵活 |
| 代理类数量 | 每个被代理类需要一个代理类 | 一个代理类可以代理多个类 |
| 性能 | 较高(直接调用) | 略低(反射调用) |
| 实现复杂度 | 简单 | 较复杂 |
| 适用场景 | 代理关系简单、固定 | 代理关系复杂、多变 |
| 对被代理类要求 | 无特殊要求 | JDK代理需要实现接口,CGLIB不能代理final类 |
| 代码冗余 | 高 | 低 |
Spring框架中的AOP
MyBatis的Mapper接口
RPC框架
Hibernate的延迟加载
Spring Security