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

EasyRTC音视频实时通话:打造高清低延迟的远程会议新生态

一、项目背景​ 随着数字化办公的普及,远程会议成为企业、教育机构、政府部门等组织跨地域协作沟通的重要方式。传统远程会议系统在音视频质量、低延迟传输、多平台兼容性等方面存在不足,难以满足用户对高清、流畅、稳定会议体验的需求。EasyRTC作为一款…...

零基础上手Python数据分析 (21):图表选择困难症?常用可视化类型详解与应用场景指南

写在前面 —— 告别盲目绘图,理解图表语言,为你的数据找到最佳“代言人” 在前面几篇博客中,我们已经学习了使用 Matplotlib 和 Seaborn 这两大 Python 可视化利器来绘制各种图表。我们掌握了创建折线图、柱状图、散点图、箱线图等常用图表的技术。然而,仅仅知道 如何 绘…...

HarmonyOS Next 编译之如何使用多目标产物不同包名应用

引言 在日常的开发中涉及到多签名和多产物构建输出时手动切换签名文件和包名在开发中是容易出错且费时的一个操作,鸿蒙提供了自定义hvigor插件和多目标产物构建,那我们可以通过hvigor插件来动态修改不同项目配置所需要的代码,保证一套代码在…...

Oracle Database Resident Connection Pooling (DRCP) 白皮书阅读笔记

本文为“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻译加阅读笔记。觉得是重点的就用粗体表示了。 白皮书版本为March 2025, Version 3.3,副标题为:Optimizing Oracle Database resou…...

Sharding-JDBC 系列专题 - 第七篇:Spring Boot 集成与 Sharding-Proxy 简介

Sharding-JDBC 系列专题 - 第七篇:Spring Boot 集成与 Sharding-Proxy 简介 本系列专题旨在帮助开发者全面掌握 Sharding-JDBC,一个轻量级的分布式数据库中间件。本篇作为系列的第七篇文章,将重点探讨 Sharding-JDBC 与 Spring Boot 的集成,以及 Sharding-Proxy 的基本概念…...

day30 学习笔记

文章目录 前言一、凸包特征检测1.穷举法2.QuickHull法 二、图像轮廓特征查找1.外接矩形2.最小外接矩形3.最小外接圆 前言 通过今天的学习,我掌握了OpenCV中有关凸包特征检测,图像轮廓特征查找的相关原理和操作 一、凸包特征检测 通俗的讲,凸…...

变更管理 Change Management

以下是关于项目管理中 变更管理 的深度解析,结合高项(如软考高级信息系统项目管理师)教材内容,系统阐述变更管理的理论框架、流程方法及实战应用: 一、变更管理的基本概念 1. 定义 变更管理是对项目范围、进度、成本、质量等基准的修改进行系统性控制的过程,旨在确保变…...

PaddlePaddle线性回归详解:从模型定义到加载,掌握深度学习基础

目录 前言一、paddlepaddle框架的线性回归1.1 paddlepaddle模型的定义方式1.1.1 使用序列的方式 nn.Sequential 组网1.1.2 使用类的方式 class nn.Layer组网1.2 数据加载 1.3 paddlepaddle模型的保存1.3.1 基础API保存1.3.2 高级API模型的保存1.3.2.1 训练fit进行保存1.3.2.2 …...

几种Word转换PDF的常用方法

使用 Word 内置功能 步骤:打开需要转换的 Word 文档,点击左上角的 “文件” 菜单,选择 “另存为”,选择保存位置,在 “保存类型” 下拉菜单中选择 “PDF”,点击 “保存” 按钮即可。适用场景:适…...

【美化vim】

美化vim 涉及文件一个例子 涉及文件 ~/.vimrc修改这个文件即可 一个例子 let mapleader ,set number " 显示行号"set relativenumber " 显示相对行号set incsearch " 实时开启搜索高亮set hlsearch " 搜索结果高亮set autoinden…...

【git】subtree拆分大的git库到多个独立git库

【git】subtree拆分大的git库到多个独立git库 一、拆分一个子目录为独立仓库 # 这就是那个大仓库 big-project git clone gitgithub.com:tom/big-project.git cd big-project# 把所有 eiyo 目录下的相关提交整理为一个新的分支 eiyo_code git subtree split -P eiyo -b eiyo_…...

Elasticsearch 使用reindex进行数据同步或索引重构

1、批量复制优化 POST _reindex {"source": {"index": "source","size": 5000},"dest": {"index": "dest"} }2、提高scroll的并行度优化 POST _reindex?slices5&refresh {"source": {…...

JDBC对数据的增删改查操作:从Statement到PrepareStatement

目录 一 . Statement简介 二. 通过Statement添加数据 1. 创建表 2. 通过Statement添加数据 a. 获取连接 b. 获取Statement对象 c. 定义SQL语句 d. 执行SQL语句 e. 关闭资源 3. 通过Statement修改数据 4. 通过Statement删除数据 三. PreparedStatement的使用(重点) …...

智体OS上线智体管家:对话式智体应用商店访问

DTNS.OS 更新公告 - 智体管家功能发布 🌟 2024年4月22日重要更新:智体管家正式上线 智体管家是智体OS推出的全新功能,旨在让用户通过自然对话轻松发现和使用智体节点上的所有智体应用,相当于为智体网络打造了一个智能化的应用商…...

vscode flutter 插件, vscode运行安卓项目,.gradle 路径配置

Flutter Flutter Widget Snippets Awesome Flutter Snippets i dart-import Dart Data Class Generator Json to Dart Model Dart Getters And Setter GetX Snippets GetX Generator GetX Generator for Flutter flutter-img-syncvscode运行安卓项目,.gradle 路径配…...

dolphinscheduler实现(oracle-hdfs-doris)数据ETL

dolphinscheduler执行 完整脚本(自行替换相关变量)配置文件conf配置文件解析脚本转base64脚本 完整脚本(自行替换相关变量) user_olsh conf/getInfo.sh Oracle user conf/databases.conf password_olsh conf/getInfo.sh Oracle password conf/databases.conf dblink_olsh conf…...

ViewBS 的工作流程

ViewBS ViewBS 的工作流程 ViewBS 提供多个顶级命令,用于确定所需和最优参数。这些命令可分为两部分:甲基化报告和功能区域的数据可视化。 在甲基化报告部分中,提供多个顶级命令,可以生成关于读取覆盖度、甲基化水平分布、全局甲基化水平等报告。 在功能区域可视化部分…...

qt调用deepseek的API开发(附带源码)

今天讲的是使用qt做一个界面(负责接受deepseek返回的数据和客户发送数据的端口)会用流的方式接受数据提高用户体验 测试效果源码流程配置deepseek调用思路deepseek与qt联合开发界面思路 上一篇文章用的不是流开发,会让客户等待很久&#xff0…...

java中值传递的含义

Java 中的值传递(Pass by Value)详解 在 Java 中,所有参数的传递都是值传递(Pass by Value),但根据传递的数据类型不同(基本类型 vs 引用类型),表现行为会有所不同。 1.…...

【自然语言处理与大模型】如何知道自己部署的模型的最大并行访问数呢?

当你自己在服务器上部署好一个模型后,使用场景会有两种。第一种就是你自己去玩,结合自有的数据做RAG等等,这种情况下一般是不会考虑并发的问题。第二种是将部署好的服务给到别人来使用,这时候就必须知道我的服务到底支持多大的访问…...

基于PHP+MySQL实现(Web)单词助手网站

WordHelper 这是一个学习 PHP 的时候依照课程设计的要求,做的一个简单的单词助手。 系统通过 CDN 引入 Vue.js 和 ElementUI,并用 PHP 搭建了一个十分十分简易的后台。 一、设计要求 1、词汇录入与编辑。提供接口让用户录入英文单词、词义、发音、词…...

Java面试实战:谢飞机的求职记 - Spring Boot、Redis与微服务技术问答解析

场景描述 谢飞机,一位自称为“Java全栈大师”的程序员,参加了某互联网大厂的Java开发岗位面试。面试官严肃而专业,针对Spring Boot、Redis缓存以及微服务架构等核心技术展开提问。以下是谢飞机在面试中的表现。 第一轮提问(基础篇…...

【数字图像处理】立体视觉信息提取

双目立体视觉原理 设一个为参考平面,一个为目标平面。增加了一个摄像头后,P与Q在目标面T上有分别的成像点 双目立体视觉:从两个不同的位置观察同一物体,用三角测量原理计算摄像机到该物体的距离的 方法 原理:三角测量…...

解析芯片低功耗设计的底层逻辑与实现方法

芯片低功耗设计的必要性可以从实际需求和技术优化两方面来探讨: 从需求角度看,工艺进步和应用场景共同驱动低功耗设计。 随着CMOS制程持续微缩,晶体管密度和时钟频率提升导致静态功耗显著增加,漏电流问题在先进工艺中尤为明显。…...

uniapp开发2--uniapp中的条件编译总结

以下是对 uni-app 中条件编译的总结: 概念: 条件编译是一种技术,允许你根据不同的平台或环境,编译不同的代码。 在 uni-app 中,这意味着你可以编写一套代码,然后根据要编译到的平台(例如微信小…...

Netty 异步机制深度解析:Future 与 Promise 的前世今生

引言:异步编程的「糖」与「痛」 在高性能网络编程中,「异步」几乎是必备的设计模式,异步的好处就是可以提升系统吞吐量,提升效率。但很多开发者初入 Netty 时,对它的异步机制总有点模糊: 为什么 ChannelF…...

如何查看MySql主从同步的偏移量

1.Mysql的主从同步方案 mysql为了在实现读写分离,主库写,从库读 mysql的同步方案主要是通过从库读取主库的binlog日志的方式。 binlog就是一个记录mysql的操作的日志记录,从库通过拿到主库的binlog知道主库进行了哪些操作,然后在从…...

短信验证码安全实战:三网API+多语言适配开发指南

在短信服务中,创建自定义签名是发送通知、验证信息和其他类型消息的重要步骤。万维易源提供的“三网短信验证码”API为开发者和企业提供了高效、便捷的自定义签名创建服务,可以通过简单的接口调用提交签名给运营商审核。本文将详细介绍如何使用该API&…...

护眼-科学使用显示器

一 显示色温对眼睛的影响 显示器的色温设置对护眼效果至关重要,合适的色温可减少蓝光伤害并缓解视疲劳。最护眼的色温并非固定值,需根据环境光、使用时间和场景动态调整。白天推荐6500K左右,夜晚降至3000K-4000K,并借助自动调节工…...

HarmonyOS:1.7

判断题 1.订阅网络状态变化事件时,通过NetConnection类型的对象调用on方法,传入具体事件类型即可: 错误(False) 2.若使用HTTP发起一个GET请求,直接调用get方法,传入请求资源的URL,即可发起请求&#xff…...

物联网赋能玻璃制造业:实现设备智能管理与生产协同

在当今数字化时代,物联网技术正深刻改变着传统制造业的发展模式,玻璃制造业也不例外。物联网的赋能,为玻璃制造业带来了设备智能管理与生产协同的新机遇,推动其向智能化、高效化迈进。 在设备智能管理方面,物联网通过…...

【我的创作纪念日】 --- 与CSDN走过的第365天

个人主页:夜晚中的人海 不积跬步,无以至千里;不积小流,无以成江海。-《荀子》 文章目录 🎉一、机缘🚀二、收获🎡三、 日常⭐四、成就🏠五、憧憬 🎉一、机缘 光阴似箭&am…...

路由器转发规则设置方法步骤,内网服务器端口怎么让异地连接访问的实现

在路由器上设置端口转发(Port Forwarding)可以将外部网络流量引导到特定的局域网设备,这对于需要远程访问服务器、摄像头、游戏主机等设备非常有用。 登录路由器管理界面,添加端口转发规则让外网访问内网的实现教程分享。以下是设…...

Kotlin 的 suspend 关键字

更多相关知识 Kotlin 的 suspend 关键字是 Kotlin 协程的核心组成部分,它用于标记一个函数可以被挂起(暂停执行)并在稍后恢复执行,而不会阻塞线程。 理解 suspend 的作用需要从以下几个方面入手: 1. 允许非阻塞的异步…...

Java面试实战:从Spring Boot到微服务的深入探讨

Java面试实战:从Spring Boot到微服务的深入探讨 场景:电商场景的面试之旅 在某互联网大厂的面试间,面试官李老师正襟危坐,而对面坐着的是传说中的“水货程序员”赵大宝。 第一轮:核心Java与构建工具 面试官&#x…...

文件操作和IO(上)

绝对路径和相对路径 文件按照层级结构进行组织(类似于数据结构中的树型结构),将专门用来存放管理信息的特殊文件称为文件夹或目录。对于文件系统中文件的定位有两种方式,一种是绝对路径,另一种是相对路径。 绝对路径…...

【Dify(v1.2) 核心源码深入解析】Apps 模块

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容&#xff…...

小测验——根据调整好的参数进行批量输出

文章目录 一、前言与目的二、思考坐标系怎么生成2.1 补2.2 对于自己投影代码中对数据集参数的情况(取负)总结三、代码2.1 用这套代码可视化 pytorch3d能跑通的例子2.2 gshell的例子2.3 直接手写投影的例子四、思路4.1 确定牛和衣服方向4.2 推测牛的视角4.3 教程学习4.3.1 fov…...

蓝耘平台介绍:算力赋能AI创新的智算云平台

一、蓝耘平台是什么 蓝耘智算云(LY Cloud)是蓝耘科技打造的现代化GPU算力云服务平台,深度整合自研DS满血版大模型技术与分布式算力调度能力,形成"模型算力"双轮驱动的技术生态。平台核心优势如下: 平台定位…...

23种设计模式-结构型模式之桥接模式(Java版本)

Java 桥接模式(Bridge Pattern)详解 🌉 什么是桥接模式? 桥接模式用于将抽象部分与实现部分分离,使它们可以独立变化。 通过在两个独立变化的维度之间建立“桥”,避免因多维度扩展导致的类爆炸。 &#x…...

Python常用的第三方模块之数据分析【pdfplumber库、Numpy库、Pandas库、Matplotlib库】

【pdfplumber库】从PDF文件中读取内容 import pdfplumber #打开PDF文件 with pdfplumber.open(DeepSeek从入门到精通(20250204).pdf) as pdf:for i in pdf.pages: #遍历页print(i.extract_text()) #extract_text()方法提取内容print(f----------------第{i.page_number}页结束…...

PerfettoSQL

​​​​# Device State: Top App # select id, ts, dur, name from (__query_slice_track__long_battery_tracing_Device_State_Top_app) --> 简便方法 """ INCLUDE PERFETTO MODULE android.battery_stats; select * from android_battery_stats_event_s…...

【Python笔记 03 】运算符

一、算数运算符 1、加减乘除 #加法 print (11) #减法 print (1-1) #乘法 print (1*1) #除法,注:商一定是float浮点数,不管是否能整数,且除数不能为0,如下图: print (1/1) 如果除数为0即报错提示。 …...

组网技术-BGP技术,IS-IS协议,VRRP技术

1.BGP在不同自治系统AS进行路由转发 EBGP外部边界网关协议 IBGP内部边界网关协议 2.AS指的是同一个组织管理下,使用统一选路策略的设备集合 3.AS直接需要直连链路,或者通过VPN协议构造逻辑直连进行邻居建立 4.使用IGP可能存在暴露AS内部的网络信息的…...

Word处理控件Spire.Doc系列教程:C# 为 Word 文档设置背景颜色或背景图片

在 Word 文档中,白色是默认的背景设置。一般情况下,简洁的白色背景足以满足绝大多数场景的使用需求。但是,如果您需要创建简历、宣传册或其他创意文档,设置独特的背景颜色或图片能够极大地增强文档的视觉冲击力。本文将演示如何使…...

极狐GitLab 中如何自定义角色?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 自定义角色 (ULTIMATE ALL) 引入于极狐GitLab 15.7,功能标志为 customizable_roles。默认启用于极狐GitLab 15.9…...

JAVA:Web安全防御

目录 一、Web安全基础与常见威胁 OWASP Top 10核心漏洞解析 • SQL注入(SQLi)、跨站脚本(XSS)、跨站请求伪造(CSRF) • 不安全的反序列化、敏感数据泄露 Java后端常见攻击场景 • 通过HttpServletRequest…...

Nginx:支持 HTTPS

文章目录 Nginx 开启 ssl 以支持 HTTPS1 生成本地证书2 开启 ssl 以支持 HTTPS3 将 https 的请求转发给 http 最终的 nginx.conf 如下 Nginx 开启 ssl 以支持 HTTPS [!IMPORTANT] 在下文中,将采用如下定义。 HTTP端口: 80 HTTPS端口: 443 服务…...

数据库性能优化(sql优化)_分布式优化思路02_yxy

数据库性能优化_分布式优化思路02 1 核心优化策略(二)_分区智能连接优化2 核心优化策略(三)_数据本地化3 核心优化策略(四)_选择正确的数据分发方式1 核心优化策略(二)_分区智能连接优化 分区智能连接出现在多个表进行连接时的优化策略,优化效率非常明显 分区智能连接是指:…...