设计模式中的代理模式

embedded/2025/1/11 23:22:16/

在Java中,代理模式(Proxy Pattern)可以通过静态代理和动态代理两种主要方式实现。

一、静态代理模式

在编译时就已经确定了代理类和被代理类的关系。
代理类和目标对象通常实现相同的接口或继承相同父类。
缺点是对于每个需要代理的目标对象都需要创建一个代理类,这会导致代码膨胀。

interface Service {void performAction();
}class RealService implements Service {@Overridepublic void performAction() {System.out.println("Performing action in RealService.");}
}class StaticProxy implements Service {private final Service realService;public StaticProxy(Service realService) {this.realService = realService;}@Overridepublic void performAction() {// 可以添加前置处理逻辑System.out.println("Before performing action.");realService.performAction();// 可以添加后置处理逻辑System.out.println("After performing action.");}
}


二、动态代理模式

动态代理允许我们在运行时创建代理对象,而不需要为每一个委托类都编写一个具体的代理类。这提供了更高的灵活性和可扩展性。Java中的动态代理主要分为两种:基于接口的代理和基于子类的代理。

1. JDK动态代理

使用java.lang.reflect.Proxy类结合InvocationHandler接口,在运行时动态生成代理对象。
只适用于实现了接口的类。
这种方式允许在不修改原代码的情况下为多个接口方法添加通用的行为。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class DynamicProxyExample {public static void main(String[] args) {Service realService = new RealService();Service proxyInstance = (Service) Proxy.newProxyInstance(realService.getClass().getClassLoader(),realService.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before " + method.getName());Object result = method.invoke(realService, args);System.out.println("After " + method.getName());return result;}});proxyInstance.performAction();}
}


2. CGLIB 动态代理

当目标对象没有实现任何接口时,可以使用CGLIB库通过继承的方式生成代理类。
CGLIB会在运行时生成目标类的一个子类,并重写其中的方法以插入自定义逻辑。
注意:由于CGLIB是通过继承实现的,因此不能用于代理final类或方法。
使用CGLIB需要引入相应的依赖(如Maven依赖)。

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CglibProxyExample {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(RealService.class);enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Before " + method.getName());Object result = proxy.invokeSuper(obj, args);System.out.println("After " + method.getName());return result;}});Service service = (Service) enhancer.create();service.performAction();}


http://www.ppmy.cn/embedded/153148.html

相关文章

使用 SQL 和表格数据进行问答和 RAG(7)—将表格数据(CSV 或 Excel 文件)加载到向量数据库(ChromaDB)中

将表格数据&#xff08;CSV 或 Excel 文件&#xff09;加载到向量数据库&#xff08;ChromaDB&#xff09;中。这里定义的类 PrepareVectorDBFromTabularData&#xff0c;它的主要功能是读取表格数据文件到DataFrame中、生成嵌入向量、并将这些数据存储在向量数据库的集合中&am…

Electron使用记录

Electron 参考引用 参考文档&#xff1a; ElectronVue3.2TypeScriptVite开发桌面端 - 掘金 (juejin.cn) 如何用Electronvuevite构建桌面端应用(一) - 掘金 (juejin.cn) Electron教程&#xff08;三&#xff09;如何打包 electron 程序&#xff1a;electron-forge 的使用教程-C…

CRTP编程模式(奇异递归模板)实现客户端的https管理模块

一、什么是 CRTP&#xff08;Curiously Recurring Template Pattern&#xff09;&#xff1f; CRTP 是 C 中的一种编程技巧&#xff0c;它利用模板机制来实现静态多态性。 简单来说&#xff0c;CRTP 是指派生类在继承基类时&#xff0c;将自身作为模板参数传递给基类。通过这种…

Current offset 978 for partition [topic,0] out of range; reset offset to 979

这个错误信息出现在使用Apache Kafka时&#xff0c;表示消费者在尝试读取某个分区的数据时&#xff0c;当前的偏移量&#xff08;offset&#xff09;已经不在可用的范围内。具体来说&#xff0c;消费者尝试读取的偏移量978超出了可用范围&#xff0c;因此Kafka自动将偏移量重置…

【ACM独立出版 - 往届 EI Scopus 检索记录 | 教育,计算机相关主题均可投稿】第六届大数据与信息化教育国际学术会议(ICBDIE 2025)

高录用 | 快EI检索 | 年度高届数重磅会议 | 高校联合支持举办 ACM 独立出版&#xff01;见刊检索快速稳定&#xff01;往届 EI & Scopus 检索记录 教 育&#xff0c;计算机相关主题均可投稿 支持单位&#xff1a;西北师范大学、西交利物浦大学、University of Leicester…

【Vue.js 组件化】高效组件管理与自动化实践指南

文章目录 摘要引言组件命名规范与组织结构命名规范目录组织 依赖管理工具自动化组件文档生成构建自动引入和文档生成的组件化体系代码结构自动引入组件配置使用 Storybook 展示组件文档自动生成 代码详解QA 环节总结参考资料 摘要 在现代前端开发中&#xff0c;组件化管理是 V…

Redis 全维度深度剖析:从基础架构到实战应用

一、Redis 简介 Redis&#xff08;Remote Dictionary Server&#xff09;是一款开源的、基于内存的数据结构存储系统&#xff0c;由 Salvatore Sanfilippo&#xff08;网名&#xff1a;antirez&#xff09;于 2009 年开发并开源。它以其高性能、丰富的数据结构以及简单易用的特…

计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…