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

代理设计模式:从底层原理到源代码 详解

        代理设计模式(Proxy Pattern)是一种结构型设计模式,它通过创建一个代理对象来控制对目标对象的访问。代理对象充当客户端和目标对象之间的中介,允许在不修改目标对象的情况下添加额外的功能(如权限控制、日志记录、延迟加载等)。以下将从底层原理到源代码层面,逐步为非专业人士详细解释代理设计模式的每个方面。


一、代理设计模式的通俗概念

1. 什么是代理?

        想象你在网上购物,想买一件衣服,但你没有时间直接去实体店。于是,你请了一个朋友(代理)帮你去店里挑衣服、付款并带回来。这个朋友就是“代理”,他代替你完成了与商店的交互。你(客户端)只需要告诉代理你的需求(比如颜色、尺码),代理会帮你处理一切细节。

 在程序设计中,代理模式也是类似的:

         - 客户端:发出请求的一方(比如你)。

         - 代理对象:代替客户端与目标对象交互的对象(比如你的朋友)。

         - 目标对象:真正完成工作的对象(比如商店里的衣服)。

        代理对象可以在客户端和目标对象之间添加额外的逻辑,比如检查你是否有足够的钱(权限控制)、记录你买了什么(日志记录),或者延迟去商店直到你确认要买(延迟加载)。

2. 为什么需要代理?

        代理模式解决的问题是:在不直接修改目标对象的情况下,控制访问或增强功能

        常见场景包括:

                 - 权限控制:只有特定用户可以访问目标对象。

                 - 延迟加载:只有在需要时才加载目标对象(比如加载大文件)。

                 - 日志记录:记录目标对象被调用的时间和参数。

                 - 远程访问:代理隐藏了目标对象在远程服务器上的细节。

3. 代理模式的本质

        代理模式的核心是封装和控制。代理对象封装了对目标对象的访问,客户端通过代理间接调用目标对象的方法。代理可以在调用前后添加额外的逻辑,但客户端无需关心这些细节。


二、代理设计模式的底层原理

代理模式的实现基于面向对象编程的以下关键概念:

 1. 接口/抽象类:代理对象和目标对象通常实现同一个接口或继承同一个抽象类,确保它们有相同的方法签名,客户端可以无缝切换。

 2. 组合/委托:代理对象通常持有一个目标对象的引用,通过委托(调用目标对象的方法)完成实际工作。

 3. 拦截和增强:代理对象在调用目标对象的方法前后插入额外的逻辑,控制访问或增强功能。

工作流程(以买衣服为例)

        你(客户端)告诉代理:“我要买一件红色的衣服。”

        代理检查你的请求(比如确认你有足够的钱)。

        代理将请求转发给商店(目标对象),商店提供衣服。

        代理可能记录日志(“你买了一件红色衣服”)。

        代理将衣服返回给你。

        在代码中,这个流程表现为:

                 - 客户端调用代理对象的方法。

                 - 代理对象执行前置逻辑(如检查权限)。

                 - 代理对象调用目标对象的方法。

                 - 代理对象执行后置逻辑(如记录日志)。

                 - 代理对象返回结果给客户端。


三、代理模式的类型

代理模式根据用途分为几种常见类型,理解这些类型有助于选择合适的实现方式:

 1. 虚拟代理(Virtual Proxy):延迟加载目标对象,适合目标对象创建成本高的情况(如加载大图片)。

 2. 保护代理(Protection Proxy):控制对目标对象的访问,通常用于权限管理。

 3. 远程代理(Remote Proxy):隐藏目标对象位于远程服务器的细节,客户端感觉像在本地调用。

 4. 智能代理(Smart Proxy):在调用目标对象时添加额外功能,如日志、计数等。

本文将以保护代理为例,详细讲解其实现,因为它简单且能清晰展示代理模式的原理。


四、代理模式的详细实现

        以下通过一个具体的例子,用 Java 语言从头实现一个保护代理,逐步解释每部分代码的原理。假设我们有一个文件访问系统,只有管理员可以删除文件,普通用户只能读取文件。

静态代理

1. 定义接口(统一代理和目标对象的契约)

        我们需要一个接口,定义文件操作的行为。代理和目标对象都实现这个接口,确保客户端可以用一致的方式调用它们。

 public interface FileAccess {void readFile(String fileName);void deleteFile(String fileName);
}

解释

 - FileAccess 接口定义了两个方法:readFile(读取文件)和deleteFile(删除文件)。

 - 代理和目标对象都实现这个接口,客户端通过接口调用方法,无需关心背后是代理还是目标对象。

 - 这就像你告诉代理“我要买衣服”,代理和商店都理解“买衣服”这个指令。

2. 实现目标对象(实际干活的类)

目标对象是真正执行文件操作的类,比如实际访问文件系统。

public class RealFileAccess implements FileAccess {@Overridepublic void readFile(String fileName) { System.out.println("读取文件: " + fileName); }@Overridepublic void deleteFile(String fileName) {System.out.println("删除文件: " + fileName);}}

解释

 - RealFileAccess 是目标对象,实现了 FileAccess 接口。

 - readFile 和 deleteFile 方法模拟文件操作,实际中可能涉及文件系统调用。

 - 这个类就像商店,负责实际提供衣服(执行核心逻辑)。

3. 实现代理对象(控制访问)

代理对象也实现 FileAccess 接口,但它会检查权限,并在调用目标对象之前添加控制逻辑。

public class FileAccessProxy implements FileAccess { private RealFileAccess realFileAccess; private String userRole;public FileAccessProxy(String userRole) {this.userRole = userRole;this.realFileAccess = new RealFileAccess(); // 持有目标对象引用}@Overridepublic void readFile(String fileName) {System.out.println("Proxy: 记录读请求 " + fileName);realFileAccess.readFile(fileName); // 委托给目标对象}@Overridepublic void deleteFile(String fileName) {if (userRole.equals("admin")) {System.out.println("Proxy: 有权删除文件: " + fileName);realFileAccess.deleteFile(fileName); // 委托给目标对象} else {System.out.println("Proxy: 权限不足,只有管理员才能删除文件.");}}}

解释

 - 构造函数:FileAccessProxy 接受 userRole(用户角色,如 “admin” 或 “user”),并创建目标对象 RealFileAccess。

- 持目标对象引用:代理通过 realFileAccess 字段持有目标对象的引用,用于委托调用。

 - readFile 方法:代理直接调用目标对象的 readFile,并添加日志记录(前置逻辑)。

 - deleteFile 方法:代理检查用户角色,只有管理员(userRole 为 “admin”)可以删除文件,否则拒绝访问。

 - 这就像你的朋友(代理)在去商店前检查你是否有钱(权限),然后才帮你买衣服。

4. 客户端代码(使用代理)

客户端通过代理对象访问文件系统,无需直接接触目标对象。

public class Main {public static void main(String[] args) {// 普通用户FileAccess userAccess = new FileAccessProxy(“user”);userAccess.readFile(“data.txt”);userAccess.deleteFile(“data.txt”);System.out.println("---");// 管理员FileAccess adminAccess = new FileAccessProxy("admin");adminAccess.readFile("data.txt");adminAccess.deleteFile("data.txt");}
}

输出

Proxy: 记录读请求文件 data.txt
读取文件: data.txt
Proxy: 权限不足,只有管理员才能删除文件.
---
Proxy: 记录读请求的文件:data.txt
读取文件: data.txt
Proxy: 有权删除文件: data.txt
删除文件: data.txt

解释

 - 客户端创建两个代理对象:一个普通用户(user),一个管理员(admin)。

 - 普通用户可以读取文件,但删除文件时被拒绝。

 - 管理员可以读取和删除文件。

 - 客户端只与代理交互(FileAccess 接口),无需知道目标对象或权限检查的细节。

动态代理(Dynamic Proxy)

        动态代理是一种在运行时动态生成代理对象的技术,主要用于在不修改原始类代码的情况下,增强或控制目标对象的行为。其核心思想是通过 反射 和 接口 在运行时生成代理类,实现对目标方法的拦截和增强。

下面以租房为例:

现有租房的接口Rent

房东类Host 实现Rent接口

代理类RentHandler实现InvocationHandler接口

1. 动态代理的核心组件

组件作用关键类/接口
抽象接口定义代理类和真实类共同的行为Rent(租房接口)
真实对象实际执行业务逻辑的类Host(房东类)
调用处理器拦截方法调用并增强逻辑InvocationHandler
动态代理类运行时生成的代理对象Proxy.newProxyInstance()

2. 动态代理的设计步骤

(1) 定义抽象接口

代理类和真实类必须实现相同的接口,确保方法调用的兼容性。

public interface Rent {void rent();int getPrice();
}
(2) 实现真实对象(被代理类)
public class Host implements Rent {@Overridepublic void rent() {System.out.println("房东出租房子");}@Overridepublic int getPrice() {return 5000;}
}
(3) 实现调用处理器(InvocationHandler

负责拦截方法调用,并插入增强逻辑(如日志、权限检查、事务管理等)。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class RentHandler implements InvocationHandler {private final Object target; // 被代理的真实对象(如 Host)public RentHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 前置增强(如权限检查)System.out.println("[代理] 正在检查租客信用...");// 调用真实对象的方法Object result = method.invoke(target, args);
​​​​​​​// 后置增强(如日志记录)System.out.println("[代理] 租房完成,签订合同");// 可修改返回值(如砍价)if ("getPrice".equals(method.getName())) {return (int) result - 500; // 代理砍价 500 元}return result;}
}
(4) 动态生成代理对象

使用 Proxy.newProxyInstance() 在运行时生成代理类:

import java.lang.reflect.Proxy;public class Client {public static void main(String[] args) {// 1. 创建真实对象Rent host = new Host();// 2. 创建调用处理器,并关联真实对象RentHandler handler = new RentHandler(host);// 3. 动态生成代理对象Rent proxy = (Rent) Proxy.newProxyInstance(Rent.class.getClassLoader(), // 使用接口的类加载器new Class[]{Rent.class},    // 代理类实现的接口handler                     // 方法调用的处理器);// 4. 通过代理对象调用方法proxy.rent();          // 会触发 RentHandler.invoke()int price = proxy.getPrice(); // 代理修改返回值System.out.println("最终价格:" + price);}
}

输出结果:

[代理] 正在检查租客信用...
房东出租房子
[代理] 租房完成,签订合同
[代理] 正在检查租客信用...
最终价格:4500

3. 动态代理的适用场景

  1. AOP(面向切面编程)

    日志记录、性能统计、事务管理。
  2. RPC(远程方法调用)

    动态代理隐藏网络通信细节(如 Dubbo、gRPC)。
  3. 权限控制

    在方法调用前检查用户权限。
  4. 缓存代理

    缓存方法返回值,避免重复计算。

4. 动态代理的优缺点

✅ 优点

  • 无侵入性:无需修改原有代码,直接增强功能。

  • 灵活扩展:一个 InvocationHandler 可代理多个接口。

  • 符合开闭原则:新增功能不影响原有逻辑。

❌ 缺点

  • 基于接口:只能代理接口,不能代理类(需用 CGLIB 弥补)。

  • 性能开销:反射调用比直接调用稍慢(但现代 JVM 已优化)。

动态代理 vs. 静态代理

特性动态代理静态代理
代理类生成时机运行时动态生成编译时手动编写
代码量少(通用性强)多(每个代理类需单独实现)
灵活性高(可代理任意接口)低(需为每个类编写代理)
性能稍慢(反射调用)快(直接调用)


五、代理模式的详细原理拆解

1. 接口的作用

  • 接口(如 FileAccess)确保代理和目标对象有相同的方法签名,客户端可以用统一的方式调用。
  • 这实现了开闭原则:可以替换不同的代理或目标对象,而不修改客户端代码。
  • 类似于你在网上购物时,无论是通过朋友(代理)还是直接去商店,购买流程(接口)是一致的。

2. 代理的控制逻辑

  • 代理通过持有的目标对象引用(realFileAccess)将请求委托给目标对象。
  • 代理可以在调用前后添加逻辑:
    • 前置逻辑:如权限检查、日志记录。
    • 后置逻辑:如清理资源、返回结果处理。
  • 在例子中,deleteFile 的权限检查是前置逻辑,日志记录是前置和后置逻辑的结合。

3. 客户端的透明性

  • 客户端通过接口(FileAccess)调用方法,无需知道背后是代理还是目标对象。
  • 这实现了封装:客户端只关心结果,不关心权限检查或日志记录的实现细节。

4. 延迟加载(虚拟代理的扩展)

虽然本例是保护代理,但可以扩展为虚拟代理。例如,realFileAccess 可以在第一次调用时才创建:

if (realFileAccess == null) {realFileAccess = new RealFileAccess(); // 延迟初始化
}

这就像你的朋友等到你确认要买衣服时才去商店,节省时间和资源。


六、代理模式的优点和缺点

优点

控制访问:代理可以限制对目标对象的访问(如权限检查)。

功能增强:可以在不修改目标对象的情况下添加日志、缓存等功能。

解耦:客户端与目标对象隔离,降低耦合度。

灵活性:可以动态切换代理逻辑(如根据用户角色选择不同代理)。

缺点

复杂性增加:引入代理对象使系统结构更复杂。

性能开销:代理的额外逻辑可能增加调用时间。

维护成本:需要维护代理和目标对象的同步(方法签名一致)。


七、实际应用场景

代理模式在现实开发中非常常见:

 1. Spring AOP:Spring 框架使用动态代理实现切面编程(如日志、事务管理)。

 2. 数据库连接池:代理控制数据库连接的分配和回收。

 3. Web 框架:代理处理 HTTP 请求的认证、路由等。

 4. 图片延迟加载:网页中图片只有在滚动到可视区域时才加载(虚拟代理)。


八、总结

        代理设计模式通过引入一个代理对象,控制对目标对象的访问,并在不修改目标对象的情况下添加额外功能。其核心是接口统一、委托调用、逻辑增强

通过保护代理的例子,我们看到:

 - 接口定义了代理和目标对象的契约。

 - 代理对象通过持有目标对象引用,拦截和增强客户端请求。

 - 客户端通过接口透明调用,无需关心代理的内部逻辑。

相关文章:

代理设计模式:从底层原理到源代码 详解

代理设计模式(Proxy Pattern)是一种结构型设计模式,它通过创建一个代理对象来控制对目标对象的访问。代理对象充当客户端和目标对象之间的中介,允许在不修改目标对象的情况下添加额外的功能(如权限控制、日志记录、延迟…...

25、简述.NET程序集(Assembly)

.NET 程序集(Assembly) .NET 程序集(Assembly) 是 .NET 应用程序的基本部署单元,包含以下核心内容: 类型与代码: 存储类、接口等类型的定义及实现(以中间语言 IL 形式)。…...

JavaScript 笔记 --- part 5 --- Web API (part 3)

(webAPI part3) BOM 操作 JS 执行机制 javascript 是单线程的, 也就是说, 只能同时执行一个任务。 为了解决这个问题, 利用多核 CPU 的计算能力, HTML5 提出 Web Worker API, 允许 JavaScript 脚本创建多个线程, 并将任务分配给这些线程。 于是, JS 出现了同步和异步的概念。…...

HCIP(OSPF)(3)

OSPF 报文结构 公共头部:包含版本(8bit)、类型(8bit)、报文长度(16bit)、路由器 ID(32bit)、区域 ID(32bit)、校验和(16bit&#xff0…...

Docker:重塑应用开发与部署的未来[特殊字符]

Docker:重塑应用开发与部署的未来🚀 在数字化转型的浪潮中🌊,应用开发与部署面临着诸多挑战,如环境一致性差、资源利用率低、运维复杂等。而Docker,作为容器技术领域的明星产品🌟,凭…...

逻辑回归:损失和正则化技术的深入研究

逻辑回归:损失和正则化技术的深入研究 引言 逻辑回归是一种广泛应用于分类问题的统计模型,尤其在机器学习领域中占据着重要的地位。尽管其名称中包含"回归",但逻辑回归本质上是一种分类算法。它的核心思想是在线性回归的基础上添…...

如何改电脑网络ip地址完整教程

更改电脑的网络IP地址以满足特定的网络需求,本文将为您提供一份详细的步骤指南。其实,改变IP地址并不是一件复杂的事,能解决因为IP限制带来的麻烦。以下是操作指南: 方法一:Windows 系统,通过图形界面修改 …...

Scenario Dreamer:用于生成驾驶模拟环境的矢量化潜扩散模型

25年3月来自加拿大 Mila AI研究院、蒙特利尔大学、蒙特利尔理工、普林斯顿、加拿大 CIFAR AI Chair 计划和 Torc 机器人公司的论文“Scenario Dreamer: Vectorized Latent Diffusion for Generating Driving Simulation Environments”。 Scenario Dreamer,是一个完…...

# 基于PyTorch的食品图像分类系统:从训练到部署全流程指南

基于PyTorch的食品图像分类系统:从训练到部署全流程指南 本文将详细介绍如何使用PyTorch框架构建一个完整的食品图像分类系统,涵盖数据预处理、模型构建、训练优化以及模型保存与加载的全过程。 1. 系统概述 本系统实现了一个基于卷积神经网络(CNN)的…...

【MCP Node.js SDK 全栈进阶指南】初级篇(1):MCP开发环境搭建详解

引言 Model Context Protocol (MCP) 是一种开放标准,旨在规范模型与应用程序之间的交互方式。本文作为MCP TypeScript-SDK系列的第一篇,将详细介绍如何搭建MCP开发环境,包括Node.js与TypeScript环境配置、SDK安装、开发工具推荐以及项目结构设计,帮助你快速入门MCP应用开发…...

unity脚本-FBX自动化模型面数校验

根据目前模型资源平均面数预算进行脚本制作,自动化校验模型面数是否符合规范。 *注:文件格式为.cs。需要放置在unity资源文件夹Assets>Editor下。 测试效果(拖一个fbx文件进unity时自动检测): 以下为完整代码 us…...

压力容器的优化设计

1 优化设计概述 优化设计是一种寻找确定最优设计方案的技术。所谓“最优设计”,指的是一种方案可以满足所有的设计要求,而且所需的支出(如重量,面积,体积,应力,费用等)最小。也就是…...

在Windows上安装Git

一、安装 Git 下载 Git地址:Git - Downloads (git-scm.com) 1、在页面中找到适用于 Windows 系统的最新版本安装包(通常为.exe 格式文件),点击下载链接。 出于访问Git官网需要科学上网,不会的可以私信我要软件包&…...

python包管理器,conda和uv 的区别

python包管理器,conda和uv 的区别 以下是 conda 和 uv 在 Python 包管理中的深度对比,结合知识库内容进行分析: 1. 核心设计理念 conda 以“环境为中心”,强调跨语言支持(如 Python、R、Julia)和严格的依赖…...

Oracle在ERP市场击败SAP

2024年,甲骨文(Oracle)以87亿美元的ERP收入和6.63%的市场份额,首次超越SAP,成为全球最大的ERP应用软件供应商,结束了SAP自上世纪80年代以来在该领域的长期霸主地位。据APPS RUN THE WORLD的市场调研&#x…...

Kafka 消息积压监控和报警配置的详细步骤

Kafka 消息积压监控和报警配置的详细步骤示例,涵盖常用工具(如 Prometheus Grafana、云服务监控)和自定义脚本方法: 一、监控配置 方法1:使用 Prometheus Grafana kafka-exporter 步骤1:部署 kafka-ex…...

记录一次使用面向对象的C语言封装步进电机驱动

简介 (2025/4/21) 本库对目前仅针对TB6600驱动下的42步进电机的基础功能进行了一定的封装, 也是我初次尝试以面向对象的思想去编写嵌入式代码, 和直流电机的驱动步骤相似在调用stepmotor_attach()函数和stepmotor_init()函数之后仅通过结构体数组stepm然后指定枚举变量中的id即…...

QTextDocument 入门

一、QTextDocument QTextDocument 是 Qt 中用于处理富文本文档的核心类,支持文本格式、图片、表格等复杂内容。 1. QTextDocument 入门 1.1 基本概念 QTextDocument 是 Qt 中用于处理富文本内容的核心类,它提供了: 结构化文本存储(段落、列表、表格等) 文本格式支持(…...

Arthas进阶用法

目录 查看已加载的类反编译代码动态执行代码排查 HTTP 请求问题热更新代码获取 Spring Context 并操作查看 JVM 信息自定义命令Web Console重置与退出 查看已加载的类 sc 命令 :可以查找所有 JVM 已经加载到的类。如果搜索的是接口,还会搜索所有的实现类…...

三生原理与现有密码学的核心区别?

AI辅助创作: 三生原理与现有密码学的核心区别 一、‌哲学基础与设计逻辑‌ ‌动态生成 vs 静态分析‌ 三生原理以“阴阳动态平衡”为核心,通过参数化生成(如素数构造中的阴阳元联动公式)模拟系统演化过程,而现有密码…...

定义python中的函数和类

1.函数 在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回 1.1 定义函数 def showshow(sex):if sex1:return manelse:retu…...

明远智睿2351开发板四核1.4G Linux处理器:驱动创新的引擎

在科技日新月异的今天,创新成为了推动社会进步的核心动力。而在这场创新的浪潮中,一款性能卓越、功能全面的处理器无疑是不可或缺的引擎。今天,我们介绍的这款四核1.4G处理器搭配Linux系统的组合,正是这样一款能够驱动未来创新的强…...

【前端】【业务逻辑】【面试】JSONP处理跨域原理与封装

&#x1f9e0; 一、JSONP 是什么&#xff1f; 项目内容&#x1f4cc; 全称JSON with Padding&#x1f4cd; 用途跨域请求数据的一种方式&#xff0c;绕过同源策略&#x1f4e6; 本质通过 <script> 标签加载远程 JS 文件&#xff0c;这个文件执行一个回调函数并传入数据 …...

深入探索RAG:用LlamaIndex为大语言模型扩展知识,实现智能检索增强生成

大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT和Llama&#xff0c;在回答问题方面表现出色&#xff0c;但它们的知识仅限于训练时所获取的信息。它们无法访问私有数据&#xff0c;也无法在训练截止日期之后学习新知识。那么&#xff0c;核心问题就是……我们如…...

移远通信智能模组助力东成“无边界智能割草机器人“闪耀欧美市场

2025年4月21日&#xff0c;移远通信宣布&#xff0c;旗下SC206E-EM智能模组已成功应用于江苏东成电动工具有限公司旗下的DCK TERRAINA无边界智能割草机器人。 这款智能模组高度集成计算、通信、定位等多元能力&#xff0c;以小型化、低功耗、实时性强和低成本等综合优势&#…...

测试-时间规模化定律可以改进世界基础模型吗?

25年3月来自 UT Austin、UW Madison 和 Nvidia 的论文“Can Test-Time Scaling Improve World Foundation Model?”。 世界基础模型&#xff08;WFM&#xff09;通过根据当前的观察和输入预测未来状态来模拟物理世界&#xff0c;已成为许多物理智能&#xff08;PI&#xff09…...

VMwaer虚拟机复制粘贴、ROS系统安装

一、VMwaer虚拟机复制粘贴设置&#xff1a;设置完记得重启VMwaer 1.首先确定 虚拟机设置-->选项-->客户机隔离-->勾选 启用拖放 启用复制粘贴 2.如果还是不能粘贴 可能是 没有 VMware Tools 可参考 怎么在linux安装vmware tools-CSDN博客 设置完记得重启VMwaer。…...

安装 vmtools

第2章 安装 vmtools 1.安装 vmtools 的准备工作 1&#xff09;现在查看是否安装了 gcc ​ 查看是否安装gcc 打开终端 输入 gcc - v 安装 gcc 链接&#xff1a;https://blog.csdn.net/qq_45316173/article/details/122018354?ops_request_misc&request_id&biz_id10…...

HCIP(综合实验2)

1.实验拓补图 2.实验要求 1.根据提供材料划分VLAN以及IP地址&#xff0c;PC1/PC2属于生产一部员工划分VLAN10,PC3属于生产二部划分VLAN20 2.HJ-1HJ-2交换机需要配置链路聚合以保证业务数据访问的高带宽需求 3.VLAN的放通遵循最小VLAN透传原则 4.配置MSTP生成树解决二层环路问题…...

机器学习第一篇 线性回归

数据集&#xff1a;公开的World Happiness Report | Kaggle中的happiness dataset2017. 目标&#xff1a;基于GDP值预测幸福指数。&#xff08;单特征预测&#xff09; 代码&#xff1a; 文件一&#xff1a;prepare_for_traning.py """用于科学计算的一个库…...

Spark-Streaming简介及核心编程

一、核心概念&#xff1a; 1.Spark-Streaming 是流式数据处理框架&#xff0c;基于 **DStream&#xff08;离散化流&#xff09;** 抽象&#xff0c;将实时数据划分为多个时间区间的 RDD 序列。 DStream 本质是RDD 序列&#xff0c;每个时间区间数据对应一个 RDD。 2.特点&a…...

优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论

优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论 目录 优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论信息论信息熵明确问题主题提供具体细节限定回答方向规范语言表达概率论最优化理论信息论 原理:信息论中的熵可以衡量信息的不确定性。…...

Sqlserver安全篇之_Sqlcmd命令使用windows域账号认证sqlserver遇到问题如何处理的案例

sqlcmd https://learn.microsoft.com/zh-cn/sql/tools/sqlcmd/sqlcmd-connect-database-engine?viewsql-server-ver16 sqlcmd -S指定的数据库连接字符串必须有对应的有效的SPN信息&#xff0c;否则会报错SSPI Provider: Server not found in Kerberos database. 正常连接 1、…...

基于华为云 ModelArts 的在线服务应用开发(Requests 模块)

基于华为云 ModelArts 的在线服务应用开发&#xff08;Requests 模块&#xff09; 一、本节目标 了解并掌握 Requests 模块的特点与用法学会通过 PythonRequests 访问华为云 ModelArts 在线推理服务熟悉 JSON 模块在 Python 中的数据序列化与反序列化掌握 Python 文件 I/O 的基…...

Graph Database Self-Managed Neo4j 知识图谱存储实践1:安装和基础知识学习

Neo4j 是一个原生图数据库&#xff0c;这意味着它在存储层实现了真正的图模型。它不是在其他技术之上使用“图抽象”&#xff0c;而是以您在白板上绘制想法的相同方式在Neo4j中存储数据。 自2007年以来&#xff0c;Neo4j已经发展成为一个丰富的工具、应用程序和库的生态系统。…...

【Python进阶】VSCode Python开发完全指南:从环境配置到高效调试

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1&#xff1a;配置虚拟环境案例2&#xff1a;智能代码补全案例3&#xff1a;调试配置 运行结果…...

vscode:Live Server Preview插件

这个插件不用另外打开浏览器&#xff1b;它是直接在Vscode里面预览html的&#xff0c;并且是自动实时更新的&#xff0c;不用不停地CtrlS保存查看 使用方法&#xff1a;F1 -> 弹出一个窗口输入live&#xff0c;选择即可。 运行结果如下&#xff1a;...

关于在Springboot中设置时间格式问题

目录 1-设置全局时间格式1.Date类型的时间2.JDK8时间3.使Date类和JDK8时间类统统格式化时间 2-关于DateTimeFormat注解 1-设置全局时间格式 1.Date类型的时间 对于老项目来说&#xff0c;springboot中许多类使用的是Date类型的时间&#xff0c;没有用到LocalDateTime等JDK8时…...

双周报Vol.70: 运算符重载语义变化、String API 改动、IDE Markdown 格式支持优化...多项更新升级!

2025-04-21 语言更新 async 函数的调用处语法改为和 error 相同的 f!(..)&#xff0c;原语法 f!!(..) 将触发警告 运算符重载的语义从基于方法迁移到了基于 trait&#xff0c;以后重载运算符需要通过给 moonbitlang/core/builtin 中对应的 trait 添加 impl 的形式。各个运算符…...

AI 技术发展:从起源到未来的深度剖析

一、AI 的起源与早期发展​ 人工智能&#xff08;AI&#xff09;作为计算机科学的重要分支&#xff0c;其诞生可以追溯到 20 世纪中叶。1943 年&#xff0c;艾伦・图灵提出图灵机的概念&#xff0c;为计算机科学和 AI 理论奠定了基础。1950 年&#xff0c;图灵又提出著名的图灵…...

【前端】【业务逻辑】 数据大屏自适应方案汇总

前端数据大屏自适应设计方案全解析 在前端数据大屏的开发中&#xff0c;自适应设计是关键环节&#xff0c;它能确保大屏在不同设备和屏幕尺寸上都能呈现出良好的视觉效果和交互体验。除了常见的 transform: scale、rem/vw、Flex/Grid 等方案外&#xff0c;还有其他有效的方法可…...

Java基础复习(JavaSE进阶)第六章 IO流体系

6-1 File类 01 122、File、IO流概述 02 123、File类&#xff1a;对象的创建 03 124、File类&#xff1a;判断、判断信息相关的方法 04 125、File类&#xff1a;创建、删除文件的方法 05 126、File类&#xff1a;遍历文件夹的方法 6-2 前置知识 01 127、前置知识&#xff1a;方…...

kvm下的ceph主机启动io请求统计

背景 假如一个主机存储在ceph里面&#xff0c;我们想统计下一次启动过程中的io读取的情况&#xff0c;那么可以通过下面的方法来统计 启动时间也可以通过在宿主机里面去查看&#xff0c;通过日志这边要方便一点&#xff0c;无需登录到虚拟机内部 日志开启 [global] fsid 406…...

go-Casbin使用

本次测试代码是基于单租户的RBAC鉴权 依赖 github.com/casbin/casbin/v2 github.com/casbin/gorm-adapter/v2文件存储规则文件 model.pml [request_definition] r sub, obj, act[policy_definition] p sub, obj, act[role_definition] g _, _ # 用户,角色[polic…...

基于YOLOv11的106种手语识别分析系统

基于YOLOv11的手语识别分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】多平台适配优化&#xff0c;支持Windows、macOS和Linux系统&#xff0c;确保中文字体正常渲染 【四】识别的类别数量&#xff1a;106种&#xff0c;具体类…...

CentOS创建swap内存

服务器版本为CentOS7 一、检查现有 swap 空间 sudo swapon --show如果系统中没有 swap 空间或者现有的 swap 空间不足&#xff0c;可以继续后续步骤来创建 swap 空间。 二、创建 swap 文件&#xff08;推荐 2GB 作为示例&#xff09; sudo dd if/dev/zero of/swapfile bs1M …...

OpenHarmony OS 5.0与Android 13显示框架对比

1. 架构概述 1.1 OpenHarmony OS 5.0架构 OpenHarmony OS 5.0采用分层架构设计&#xff0c;图形显示系统从底层到顶层包括&#xff1a; 应用层&#xff1a;ArkUI应用和第三方应用框架层&#xff1a;ArkUI框架、窗口管理API系统服务层&#xff1a;图形合成服务、窗口管理服务…...

详解Node.js中的setImmediate()函数

setImmediate() 是 Node.js 提供的一个定时器函数&#xff0c;用于在 事件循环的 “Check” 阶段 执行回调函数。它与 setTimeout() 相似&#xff0c;但两者有着显著的区别&#xff0c;主要体现在回调函数的执行时机上。 什么是事件循环&#xff08;Event Loop&#xff09; 在…...

使用C#写的HTTPS简易服务器

由于监控网络之用&#xff0c;需要写一个https服务器。 由于用到https&#xff0c;因此还需一个域名证书&#xff0c;可以免费申请&#xff0c;也可以用一个现有的。 接下来还需在Windows上安装证书&#xff0c;注册证书。 安装证书 找到证书&#xff0c;点击&#xff0c;一路…...

C# 事件知识文档

C# 事件知识文档 概述 在 C# 中,事件(Event) 是一种特殊的机制,它基于委托实现,用于支持发布-订阅模式。事件允许对象在发生特定操作时通知其他对象,而无需直接引用这些对象。这种机制非常适合于实现诸如用户界面交互、状态变化通知等场景。 核心概念 发布者(Publishe…...