当前位置: 首页 > news >正文

设计模式中的代理模式

在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();}

相关文章:

设计模式中的代理模式

在Java中&#xff0c;代理模式&#xff08;Proxy Pattern&#xff09;可以通过静态代理和动态代理两种主要方式实现。 一、静态代理模式 在编译时就已经确定了代理类和被代理类的关系。 代理类和目标对象通常实现相同的接口或继承相同父类。 缺点是对于每个需要代理的目标对象…...

15个学习Python 的编程游戏网站

从小很多人都会在想&#xff0c;那些枯燥的教学课程要是全部变成游戏就好了&#xff0c;这样的话那期末成绩不得立即起飞了嘛&#xff1f;那对于编程很多人也有这样的想法&#xff0c;边玩边学就好了 这不已经有很多程序员开发了多款边玩边学的编程游戏供大家使用&#xff0c;…...

微信小程序实现拖拽盒子效果

要实现一个当前盒子高度由里面的盒子进行支配高度拖拽的效果 // wxml<view class"exmation-item" wx:elif"{{type4}}"> <view class"exmation-item-drag-box" id"drag-box"> <!-- 内容 --><view class"exm…...

Linux-蓝牙协议

SPP (Serial Port Profile): 串口协议&#xff08;SPP&#xff09;是一个蓝牙配置文件&#xff0c;允许设备通过蓝牙模拟传统的串行端口通信。它通常用于无线串口连接&#xff0c;允许设备如计算机和外设&#xff08;例如打印机或条形码扫描器&#xff09;之间进行数据传输。A…...

moviepy 将mp4视频文件提取音频mp3 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…...

imageio 图片转mp4 保存mp4

目录 安装&#xff1a; imageio 图片转mp4 numpy 保存mp4 安装&#xff1a; FFMPEG: pip install imageio[ffmpeg] pyav: pip install imageio[pyav] imageio 图片转mp4 import glob import osimport cv2 import imageio from natsort import natsortedfrom PIL import …...

Postman接口测试04|批量运行测试用例、参数化、Mock Server、Cookie鉴权、Newman生成测试报告

目录 十一、Postman批量运行测试用例 十二、实现数据驱动&#xff08;也称参数化&#xff09; 1、csv文件 1️⃣编辑csv文件 2️⃣更新参数的值 3️⃣修改测试脚本和断言 5️⃣批量运行测试用例 2、Json文件 1️⃣编辑Json文件 2️⃣其他操作和处理csv文件相同 十三、…...

学技术学英语:http状态码 401 Unauthorized vs 403 Forbidden

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a;先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 unauthorized未授权的/ˌʌnˈɔːθəraɪzd/authentication认证/…...

@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时&#xff0c;会考虑组件的父子关系&#xff0c;使用了bind(this)之后&#xff0c;组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题&#xff0c;引入LocalBuilder装饰器。…...

React(二)——Admin主页/Orders页面/Category页面

文章目录 项目地址一、侧边栏1.1 具体实现 二、Header2.1 实现 三、Orders页面3.1 分页和搜索3.2 点击箭头显示商家所有订单3.3 页码按钮以及分页 四、Category页面4.1 左侧商品添加栏目4.2 右侧商品上传栏 五、Sellers页面六、Payment Request 页面&#xff08;百万数据加载&a…...

移动端屏幕分辨率rem,less

谷歌模拟器&#xff1a;能直接看到移动端效果 屏幕分辨率 右键电脑桌面 &#xff0c;点击显示设置 PC端是逻辑分辨率&#xff0c;移动端代码也是参考逻辑分辨率 网页端宽度和逻辑分辨率尺寸相同 手机屏幕尺寸不同&#xff0c;网页宽度均为 100% 所以就需要添加视口标签&#x…...

Docker Desktop 构建java8基础镜像jdk安装配置失效解决

Docker Desktop 构建java8基础镜像jdk安装配置失效解决 文章目录 1.问题2.解决方法3.总结 1.问题 之前的好几篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop环境构建java8的最小jre基础镜像&#xff0c;前几天我使用Docker Desktop环境重新构建了一个…...

数据结构:栈(Stack)和队列(Queue)—面试题(一)

目录 1、括号匹配 2、逆波兰表达式求值 3、栈的压入、弹出序列 4、最小栈 1、括号匹配 习题链接https://leetcode.cn/problems/valid-parentheses/description/ 描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] …...

AR 眼镜之-拍照/录像动效切换-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 拍照/录像动效切换 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;第一阶段动效 2&#xff09;第二阶段动效 2. &#x1f4a0; 默认代码配置 2.1 XML 初始布局 2.2 监听滑动对 View 改变 3. ⚛️…...

2025年中科院分区大类划分公布!新增8155本

2025年中科院分区表变更情况 扩大收录范围 2025年的期刊分区表在原有的自然科学&#xff08;SCIE&#xff09;、社会科学&#xff08;SSCI&#xff09;和人文科学&#xff08;AHCI&#xff09;的基础上&#xff0c;增加了ESCI期刊的收录&#xff0c;并根据这些期刊的数据进行…...

S变换matlab实现

S变换函数 function [st,t,f] st(timeseries,minfreq,maxfreq,samplingrate,freqsamplingrate) % S变换 % Code by huasir Beijing 2025.1.10 % Reference is "Localization of the Complex Spectrum: The S Transform" % from IEEE Transactions on Signal Proc…...

Springboot——钉钉(站内)实现登录第三方应用

文章目录 前言准备1、创建钉钉应用&#xff0c;并开放网页应用2、配置网页应用各项参数发布版本 前端改造后端逻辑1、获取应用免登录 Access_token2、通过免登录 Access_token 和 Auth_Code 获取对应登录人信息 注意事项 前言 PC端的钉钉中工作台&#xff0c;增加第三方应用&a…...

基于深度学习算法的AI图像视觉检测

基于人工智能和深度学习方法的现代计算机视觉技术在过去10年里取得了显著进展。如今&#xff0c;它被广泛用于图像分类、人脸识别、图像中物体的识别等。那么什么是深度学习&#xff1f;深度学习是如何应用在视觉检测上的呢&#xff1f; 什么是深度学习&#xff1f; 深度学习是…...

cJson——序列化格式json和protobuf对比

cJson——序列化格式json和protobuf对比 1. 更小的消息体积2. 更快的序列化与反序列化速度3. 类型安全4. 向后和向前兼容性5. 更低的带宽消耗6. 高效的编码方式7. 易于跨语言支持8. 支持复杂的数据结构9. 更好的支持大型数据交换总结 Protocol Buffers (Protobuf) 和 JSON 都是…...

搭建一个fastapi的项目,调用ollama服务

1. 项目结构 my_project/ │ ├── app/ │ ├── main.py # FastAPI应用的入口 │ ├── services/ # 包含服务逻辑 │ │ └── ollama_service.py │ ├── models/ # 定义数据模型 │ │ └── response.py │ ├─…...

Wireshark编译手册(Windows)

以下是对 Wireshark 官方文档中“Windows 平台的设置和构建说明”部分的翻译和总结&#xff1a; 2.2. Windows 平台 本节提供了在 Windows 上进行 Wireshark 开发的快速设置指南&#xff0c;包含推荐的配置。 2.2.1. 使用 Microsoft Visual Studio 注意&#xff1a;除非您非…...

在高德地图上加载3DTilesLayer图层模型/天地瓦片

1. 引入必要的库 Three.js&#xff1a;一个用于创建和显示3D图形的JavaScript库。vuemap/three-layer&#xff1a;一个Vue插件&#xff0c;它允许你在高德地图中添加Three.js图层。vuemap/layer-3dtiles&#xff1a;一个用于处理3D Tiles格式数据的Vue插件&#xff0c;可以用来…...

深入浅出负载均衡:理解其原理并选择最适合你的实现方式

负载均衡是一种在多个计算资源&#xff08;如服务器、CPU核心、网络链接等&#xff09;之间分配工作负载的技术&#xff0c;旨在优化资源利用率、提高系统吞吐量和降低响应时间。负载均衡的实现方式多种多样&#xff0c;以下是几种常见的实现方式&#xff1a; 1. 硬件负载均衡&…...

STM32的存储结构

STM32F103 芯片是基于 ARM Cortex-M3 内核的微控制器&#xff0c;它集成了多种类型的存储器&#xff0c;每种存储器都有其特定的作用和存储对象。以下是关于 STM32F103 中 Flash、ROM 和 SRAM 的详细介绍&#xff1a; 1. Flash Memory (闪存) 作用&#xff1a;Flash 是非易失性…...

@SneakyThrows 注解详解

SneakyThrows 注解详解 1. 基本介绍 SneakyThrows 是 Lombok 提供的注解&#xff0c;用于简化异常处理&#xff0c;自动生成 try-catch 代码块&#xff0c;将检查型异常转换为非检查型异常。 2. 使用对比 2.1 传统写法 public String readFile(String path) {try {return …...

js监测页面可见性

监测切换页面 检测页面的可见性状态document.visibilityState:document.hiddenvisibilitychange 事件 js 检测页面切换至别的应用 检测页面的可见性状态 在JavaScript中&#xff0c;你可以使用Page Visibility API来检测页面的可见性状态。这个API提供了一组接口&#xff0c;允…...

Android wifi常见问题及分析

参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题&#xff0c;同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉&#xff0c;是否想过为何需要这样分层&#xff1f; 网上大多都是介绍每一层…...

EFCore HasDefaultValueSql

今天小伙伴在代码中遇到了有关 HasDefaultValue 的疑问&#xff0c;这里整理澄清下... 在使用 Entity Framework Core (EFCore) 配置实体时&#xff0c;HasDefaultValue 方法会为数据库列设置一个默认值。该默认值的行为取决于以下条件&#xff1a; 1. 配置 HasDefaultValue 的…...

Win10微调大语言模型ChatGLM2-6B

在《Win10本地部署大语言模型ChatGLM2-6B-CSDN博客》基础上进行&#xff0c;官方文档在这里&#xff0c;参考了这篇文章 首先确保ChatGLM2-6B下的有ptuning AdvertiseGen下载地址1&#xff0c;地址2&#xff0c;文件中数据留几行 模型文件下载地址 &#xff08;注意&#xff1…...

什么叫区块链?怎么保证区块链的安全性?

区块链&#xff08;Blockchain&#xff09;是一种分布式数据库或账本技术&#xff0c;它通过去中心化的方式记录交易或其他数据&#xff0c;并确保这些记录是安全、透明和不可篡改的。区块链最初是作为比特币&#xff08;Bitcoin&#xff09;加密货币的基础技术而被公众所知&am…...

建立网站赚钱吗/最新病毒感染

组件就是创建html中不存在的标签。...

网站建设 杭州市萧山区/快速seo整站优化排行

由于在外企工作&#xff0c;所以英语这块真的很重要&#xff0c;不过相对于花旗软件来说&#xff0c;这家外企对英语的要求低多了&#xff08;花旗软件需要自己和客户做需求&#xff0c;自己写程序&#xff0c;自己为客户维护&#xff0c;在需求分析阶段和印度的或者是英国的客…...

石家庄网站托管/简单网页制作模板

大家都知道ArrayList底层就是一个可变的数组&#xff0c;所以我在这里使用课表数组简易的写一个MyArrayListpackage com.zzq.me;public class MyArrayList<T> {private Object [] value;private int size;public MyArrayList () {this(10);}public MyArrayList (int capa…...

wordpress开发西瓜/哪个平台可以随便发广告

数据库系统的组成 硬件平台及数据库 软件 人员 硬件平台及数据库 数据库系统对硬件资源的要求 足够大的内存足够的大的磁盘或磁盘阵列等外部设备较高的通道能力&#xff0c;提高数据传送率 软件 数据库管理系统 支持数据库管理系统运行的操作系统 与数据库接口的高级语…...

那个做网站好/搜索广告是什么

Arcgis中如何为Shapefile属性表添加字段属性描述了要素的相关特性&#xff0c;并存储于表中。在创建新的属性表或是向已有的属性表中增加字段的时候&#xff0c;必须指明数据类型和字段属性&#xff0c;比如精度(Precision)或长度(Length)。数据类型的选择和相关设置会影响存储…...

制作 网站/百度快照优化排名推广怎么做

access总结 在access数据库管理系统中&#xff0c;数据库是一个基础&#xff0c;它主要用来存储数据库应用系统中的其他数据库对象&#xff0c;也就是说&#xff0c;构成数据库应用系统的其他对象都存储在数据库中。 access第二章书中介绍使用access创建数据库的各种方法以及数…...