(六)趣学设计模式 之 代理模式!
目录
- 一、啥是代理模式?
- 二、为什么要用代理模式?
- 三、代理模式的实现方式
- 1. 静态代理
- 2. JDK动态代理
- 3. CGLIB动态代理
- 四、三种代理的对比
- 五、代理模式的优缺点
- 六、代理模式的应用场景
- 七、总结
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解建造者模式请看: (五)趣学设计模式 之 建造者模式!
🌟同时我的 JDK动态代理 vs CGLIB:一场经纪人之战,谁才是你的最佳选择?也不错
这篇文章带你详细认识一下设计模式中的代理模式
一、啥是代理模式?
代理模式,就像找了个替身 👯! 你想做一件事情,但是自己不想做,或者不能做,就找个代理人(替身)来帮你做 🤝。 代理人可以帮你处理一些额外的事情,比如权限控制 👮、日志记录 📝、缓存 📦 等等,让你更专注于核心业务 🎯!
简单来说,就是你不想直接面对某个对象,就找个代理来帮你!
- 你想做的事情比较敏感: 就像访问一些需要权限的资源 🔑,你需要先验证身份,才能访问!
- 你想做的事情比较耗时: 就像下载一个大文件 💾,你需要等待很长时间,才能完成!
- 你想做的事情比较复杂: 就像购买机票 ✈️,你需要比较不同的航班、价格和时间,才能做出选择!
二、为什么要用代理模式?
用代理模式,好处多多 👍:
- 保护目标对象: 代理可以控制对目标对象的访问,防止恶意操作 🛡️! 就像保镖保护明星 🌟,防止粉丝的疯狂行为!
- 增强目标对象的功能: 代理可以在目标对象执行前后做一些额外的事情,比如日志记录、性能监控 📈! 就像经纪人帮明星安排行程、处理事务,让明星更专注于表演!
- 延迟加载: 代理可以在需要的时候才创建目标对象,节省资源 ⏳! 就像懒加载图片 🖼️,只有当图片出现在屏幕上时,才加载图片!
- 远程代理: 代理可以代表远程对象,让你像访问本地对象一样访问远程对象 🌐! 就像 VPN,让你访问被墙的网站!
- 降低耦合度: 客户端不需要直接依赖目标对象,只需要依赖代理对象,降低了系统的耦合度 🔗!
三、代理模式的实现方式
代理模式主要分为三种:
- 静态代理: 代理类在编译时就已经确定,就像提前找好的替身演员 🎬!
- JDK动态代理: 代理类在运行时动态生成,需要实现接口,就像临时找来的替身演员 🎭!
- CGLIB动态代理: 代理类在运行时动态生成,不需要实现接口,通过继承实现,就像 AI 换脸技术 🤖!
1. 静态代理
静态代理,顾名思义,代理类是提前写好的,就像提前找好的替身演员,随时可以上场 💃!
案例:火车站卖票(经典案例 🚂)
如果要买火车票的话,需要去火车站买票,坐车到火车站,排队等一系列的操作,显然比较麻烦 😫。而火车站在多个地方都有代售点,我们去代售点买票就方便很多了 😊。这个例子其实就是典型的代理模式,火车站是目标对象,代售点是代理对象。
代码示例:
// 卖票接口
public interface SellTickets {void sell(); // 卖票
}// 火车站 火车站具有卖票功能,所以需要实现SellTickets接口
public class TrainStation implements SellTickets {public void sell() {System.out.println("火车站卖票"); // 卖票}
}// 代售点
public class ProxyPoint implements SellTickets {private TrainStation station = new TrainStation(); // 持有火车站对象的引用public void sell() {System.out.println("代理点收取一些服务费用"); // 增强功能station.sell(); // 调用火车站的卖票方法}
}// 测试类
public class Client {public static void main(String[] args) {ProxyPoint pp = new ProxyPoint(); // 创建代理对象pp.sell(); // 调用代理对象的卖票方法}
}
分析:
从上面代码中可以看出,测试类直接访问的是 ProxyPoint
类对象,也就是说 ProxyPoint
作为访问对象和目标对象的中介 🤝。同时也对 sell
方法进行了增强(代理点收取一些服务费用 💰)。
输出结果:
代理点收取一些服务费用
火车站卖票
2. JDK动态代理
JDK动态代理,代理类是在运行时动态生成的,需要实现接口,就像临时找来的替身演员,需要会表演 💃!
案例:还是火车站卖票(升级版 🚂)
还是上面的火车站卖票的例子,但是这次我们使用JDK动态代理来实现 🚀!
代码示例:
// 卖票接口
public interface SellTickets {void sell(); // 卖票
}// 火车站 火车站具有卖票功能,所以需要实现SellTickets接口
public class TrainStation implements SellTickets {public void sell() {System.out.println("火车站卖票"); // 卖票}
}// 代理工厂,用来创建代理对象
public class ProxyFactory {private TrainStation station = new TrainStation(); // 持有火车站对象的引用public SellTickets getProxyObject() {// 使用Proxy获取代理对象/*newProxyInstance()方法参数说明:ClassLoader loader : 类加载器,用于加载代理类,使用真实对象的类加载器即可Class<?>[] interfaces : 真实对象所实现的接口,代理模式真实对象和代理对象实现相同的接口InvocationHandler h : 代理对象的调用处理程序*/SellTickets sellTickets = (SellTickets) Proxy.newProxyInstance(station.getClass().getClassLoader(),station.getClass().getInterfaces(),new InvocationHandler() {/*InvocationHandler中invoke方法参数说明:proxy : 代理对象method : 对应于在代理对象上调用的接口方法的 Method 实例args : 代理对象调用接口方法时传递的实际参数*/public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("代理点收取一些服务费用(JDK动态代理方式)"); // 增强功能// 执行真实对象Object result = method.invoke(station, args); // 调用火车站的卖票方法return result; // 返回结果}});return sellTickets; // 返回代理对象}
}// 测试类
public class Client {public static void main(String[] args) {// 获取代理对象ProxyFactory factory = new ProxyFactory();SellTickets proxyObject = factory.getProxyObject(); // 获取代理对象proxyObject.sell(); // 调用代理对象的卖票方法}
}
分析:
使用了动态代理,我们思考下面问题 🤔:
-
ProxyFactory
是代理类吗? 🙅ProxyFactory
不是代理模式中所说的代理类,而代理类是程序在运行过程中动态的在内存中生成的类 💫。 -
动态代理的执行流程是什么样? ➡️
- 客户端调用代理对象的
sell()
方法。 - 代理对象调用
InvocationHandler
的invoke()
方法。 invoke()
方法中,我们可以增强功能,比如收取服务费用。invoke()
方法中,通过反射调用真实对象的sell()
方法。- 真实对象执行
sell()
方法,返回结果。 invoke()
方法将结果返回给代理对象。- 代理对象将结果返回给客户端。
- 客户端调用代理对象的
输出结果:
代理点收取一些服务费用(JDK动态代理方式)
火车站卖票
3. CGLIB动态代理
CGLIB动态代理,代理类是在运行时动态生成的,不需要实现接口,通过继承实现,就像 AI 换脸技术,直接把你的脸换成别人的脸 🎭!
案例:还是火车站卖票(终极版 🚂)
还是上面的火车站卖票的例子,但是这次我们使用CGLIB动态代理来实现 🚀! 如果没有定义 SellTickets
接口,只定义了 TrainStation
(火车站类)。很显然JDK代理是无法使用了,因为JDK动态代理要求必须定义接口,对接口进行代理 😫。
代码示例:
// 火车站
public class TrainStation {public void sell() {System.out.println("火车站卖票"); // 卖票}
}// 代理工厂
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 ProxyFactory implements MethodInterceptor {private TrainStation target = new TrainStation(); // 持有火车站对象的引用public TrainStation getProxyObject() {// 创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数Enhancer enhancer = new Enhancer(); // 创建 Enhancer 对象// 设置父类的字节码对象enhancer.setSuperclass(target.getClass()); // 设置父类// 设置回调函数enhancer.setCallback(this); // 设置回调// 创建代理对象TrainStation obj = (TrainStation) enhancer.create(); // 创建代理对象return obj; // 返回代理对象}/*intercept方法参数说明:o : 代理对象method : 真实对象中的方法的Method实例args : 实际参数methodProxy :代理对象中的方法的method实例*/public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("代理点收取一些服务费用(CGLIB动态代理方式)"); // 增强功能Object result = methodProxy.invokeSuper(o, args); // 调用火车站的卖票方法return result; // 返回结果}
}// 测试类
public class Client {public static void main(String[] args) {// 创建代理工厂对象ProxyFactory factory = new ProxyFactory(); // 创建代理工厂// 获取代理对象TrainStation proxyObject = factory.getProxyObject(); // 获取代理对象proxyObject.sell(); // 调用代理对象的卖票方法}
}
分析:
CGLIB动态代理不需要接口,它是通过继承来实现的。
ProxyFactory
创建了一个Enhancer
对象,类似于 JDK 动态代理的Proxy
类。enhancer.setSuperclass(target.getClass())
设置父类为目标对象。enhancer.setCallback(this)
设置回调函数为MethodInterceptor
接口的实现类,也就是ProxyFactory
本身。enhancer.create()
创建代理对象,实际上是创建了一个目标对象的子类。- 当调用代理对象的
sell()
方法时,会调用MethodInterceptor
接口的intercept()
方法。 - 在
intercept()
方法中,我们可以增强功能,比如收取服务费用。 methodProxy.invokeSuper(o, args)
调用父类(目标对象)的sell()
方法。
输出结果:
代理点收取一些服务费用(CGLIB动态代理方式)
火车站卖票
四、三种代理的对比
我的文章: JDK动态代理 vs CGLIB:一场经纪人之战,谁才是你的最佳选择?讲的更好一点,可以看看
-
JDK代理 vs CGLIB代理:
特性 JDK代理 CGLIB代理 接口 必须实现接口 不需要实现接口 实现方式 通过 Proxy.newProxyInstance()
动态生成代理类通过继承目标类动态生成子类 性能 相对较慢 相对较快 使用场景 目标对象实现了接口 目标对象没有实现接口 依赖 JDK自带,无需额外依赖 需要引入 CGLIB 库 -
动态代理 vs 静态代理:
特性 静态代理 动态代理 代理类 编译时确定 运行时动态生成 灵活性 较低 较高 代码量 较大 较小 维护性 较差 较好 适用场景 代理对象数量较少,代理逻辑比较固定 代理对象数量较多,代理逻辑比较灵活
五、代理模式的优缺点
优点:
- 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用 🛡️! 就像保镖保护明星,防止粉丝的疯狂行为!
- 代理对象可以扩展目标对象的功能 📈! 就像经纪人帮明星安排行程、处理事务,让明星更专注于表演!
- 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度 🔗! 就像中间商,连接买家和卖家,让双方不用直接接触!
- 符合开闭原则,可以在不修改目标对象的情况下,增加新的代理类,扩展功能 🆕!
缺点:
- 增加了系统的复杂度 😫! 需要创建多个类,代码量比较大!
- 可能会降低性能 🐌! 代理对象会增加额外的开销,可能会影响性能!
六、代理模式的应用场景
- 远程代理: 就像 VPN,让你访问被墙的网站 🌐!
- 虚拟代理: 就像懒加载图片 🖼️,只有当图片出现在屏幕上时,才加载图片!
- 保护代理: 就像访问一些需要权限的资源 🔑,你需要先验证身份,才能访问!
- 缓存代理: 就像 CDN,缓存静态资源,提高访问速度 🚀!
- 防火墙代理: 就像防火墙,保护你的电脑免受病毒攻击 🛡️!
- 事务代理: 控制数据库事务的提交和回滚 💱!
七、总结
- 代理模式就像找了个替身,帮你做一些事情! 👯
- 主要分为静态代理、JDK动态代理和CGLIB动态代理三种! 🎭
- 优点是保护目标对象、扩展功能、降低耦合度、符合开闭原则! 👍
- 缺点是增加复杂度、可能降低性能! 👎
- 适用于需要控制对目标对象的访问、增强目标对象的功能、延迟加载、远程代理等场景! 🎯
希望这篇文章能让你彻底理解代理模式! 💯 祝你学习愉快! 😄
看完请看:(七)趣学设计模式 之 适配器模式!
相关文章:
(六)趣学设计模式 之 代理模式!
目录 一、啥是代理模式?二、为什么要用代理模式?三、代理模式的实现方式1. 静态代理2. JDK动态代理3. CGLIB动态代理 四、三种代理的对比五、代理模式的优缺点六、代理模式的应用场景七、总结 🌟我的其他文章也讲解的比较有趣😁&a…...
【CSS】HTML元素布局基础总结
HTML默认布局和元素显示 CSS 元素显示 { HTML 默认布局: 流式布局 { 从左到右,从上到下 随页面宽度变化动态排列元素 文档流:整个 H T M L 文档的流式布局 HTML 元素分为 { 块级元素 :默认占满一行 行内元素 :在行内最…...
【JavaScript】什么是JavaScript?以及常见的概念
作为 JavaScript 初学者,想要更好地理解这门语言,需要从核心概念、实践练习和项目实战三个方面入手。下面是详细的学习路线和方法,帮助你系统性地掌握 JavaScript。 一、理解 JavaScript 的核心概念 JavaScript 是一门动态、弱类型的编程语言…...
为什么要将PDF转换为CSV?CSV是Excel吗?
在企业和数据管理的日常工作中,PDF文件和CSV文件承担着各自的任务。PDF通常用于传输和展示静态的文档,而CSV因其简洁、易操作的特性,广泛应用于数据存储和交换。如果需要从PDF中提取、分析或处理数据,转换为CSV格式可能是一个高效…...
P1038 [NOIP 2003 提高组] 神经网络
题目描述 在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经元,而且两个神经元之间至多有一条边相连,下图是一个神经元的例子: 神经元(编号为 i) 图中,X1∼X3 是信息…...
TypeScript 类型断言的适用场景及代码示例
类型断言的适用场景及代码示例 适用场景 类型断言就像是你很确定某个东西是什么,然后直接告诉 TypeScript 编译器“相信我,它就是这个类型”。以下是几种常见的适用场景: 从 any 类型恢复具体类型:当你使用 any 类型时…...
Docker 容器
Docker 是一种开源的容器化平台,可以让开发人员将应用程序及其依赖项打包到一个可移植的容器中,然后部署到任何支持 Docker 的环境中。Docker 的基本概念包括以下几点: 1. **容器(Container)**:容器是一个独立、轻量级的运行环境…...
Spark(3)vi的基本使用
一.打开与创建文件 二.三种模式 三. 光标操作 四.复制粘贴 一.打开与创建文件 它是linux的内置命令,所以还是以命令的方式来运行。 命令的格式是:Vi /路径/文件名。要注意如下两种情况: 1.如果这个文件不存在,此时就是新建文…...
element-ui的组件使用
1. 安装 Element UI(在文件夹最上面输入cmd进入dos窗口,然后输入安装指令 npm install element-ui --save) 2.在main.js文件全局引入(main.js文件负责 全局注册 ),在该文件注册的所有组件在其他文件都能直接调用,一般…...
Starlink卫星动力学系统仿真建模第九讲-滑模(SMC)控制算法原理简介及卫星控制应用
滑模控制(Sliding Mode Control)算法详解 一、基本原理 滑模控制(Sliding Mode Control, SMC)是一种变结构控制方法,通过设计一个滑模面(Sliding Surface),迫使系统状态在有限时间内…...
《深度剖析Linux 系统 Shell 核心用法与原理_666》
1. 管道符的用法 查找当前目录下所有txt文件并统计行数 # 使用管道符将ls命令的结果传递给wc命令进行行数统计 ls *.txt | wc -l 在/etc目录下查找包含"network"的文件并统计数量 # 使用find命令查找文件,并通过grep查找包含特定字符串的文件…...
51单片机学习之旅——定时器
打开软件 1与其它等于其它,0与其它等于0 1或其它等于1,0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作,高四位保持,低四位清零,高四位定时器1,低四位定时器0 TMODTMOD|0x01;//0x010000 0…...
超详细介绍map(multimap)的使用
map类的介绍 map的声明如下,Key是map底层关键字的类型,T是map底层value的类型。set默认要求Key支持小于比较,如果不支持或者需要的情况下我们可以自行传入仿函数,map底层存储数据的内存是从空间申请来的。一般情况下,我…...
原生稀疏注意力NSA 替换transformer 注意力进行文本生成训练
DeepSeek-R1这篇文章,聚焦范围更加小,R1的重点在于提出了一个文本生成的训练策略和蒸馏策略,这篇文章则是提出了一个注意力机制NSA,主要解决的是长序列做注意力时带来的效率问题。通篇文章看下来,它的实际意义可能比较…...
读书笔记:《百年孤独》
《百年孤独》加西亚.马尔克斯 著 范晔 译 读出了阅读障碍。 记不得书中的人,记不得书中的事,更不知何为孤独,只记得马孔多,这个陌生的地方,还有那个猪尾巴婴儿。 百年:故事跨越了百年 孤独&#…...
TVS管学习记录
文章目录 前言一、TVS是什么?二、TVS关键参数1.反向截至电压**实际意义** 2.钳位电压**定义与作用****选择依据** **4. 实际应用示例****场景:通信端口的ESD保护** 3.反向截至电压和钳位电压的关联和区别**. 小结** 三、实际应用电路举例总结 前言 TVS管…...
网络安全系统概述 网络安全系统分为几级
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 5级 网络信息系统安全等级保护分为五级,一级防护水平最低,最高等保为五级。分别是用户自主保护级、系统审计保护级、安全标记保护级、结构…...
基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知
写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 😃,生活加油 我站在人潮中央,思考这日日重复的生活。我突然想,…...
Apache Flink架构深度解析:任务调度、算子数据同步与TaskSlot资源管理机制
Apache Flink是一个分布式流处理框架,其核心架构设计围绕有界与无界数据流的统一处理能力展开。以下从任务分配、算子数据同步、TaskManager与JobManager的TaskSlot机制三个维度展开详细分析: 一、任务分配机制 Flink的任务分配基于并行度(P…...
Linux 常见命令全解析
一、文件操作命令 1. ls ls是列出目录内容的命令。简单输入ls,会展示当前目录下的文件和目录列表。想要获取更详细的信息,比如文件权限、所有者、大小、修改时间等,使用ls -l。若要显示所有文件,包括以点(.ÿ…...
k8s集群部署
集群结构 角色IPmaster192.168.35.135node1192.168.35.136node2192.168.35.137 部署 #需在三台主机上操作 //关闭防火墙 [rootmaster ~]# systemctl disable --now firewalld//关闭selinux [rootmaster ~]# sed -i s/enforcing/disabled/ /etc/selinux/config//关闭swap分区…...
springboot005学生心理咨询评估系统(源码+数据库+文档)
源码地址:学生心理咨询评估系统 文章目录 1.项目简介2.部分数据库结构与测试用例3.系统功能结构4.包含的文件列表(含论文)后台运行截图 1.项目简介 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了,把现…...
LeetCode37
LeetCode37 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结...
2025年02月24日Github流行趋势
项目名称:mastra 项目地址url:https://github.com/mastra-ai/mastra 项目语言:TypeScript 历史star数:5735 今日star数:1140 项目维护者:adeleke5140, abhiaiyer91, TheIsrael1, adeniyii, Joshuafolorunsh…...
Spring Boot 中的日志管理
一、日志框架选择 1. 主流框架对比 框架特点Spring Boot 默认支持Logback- 性能优异,Spring Boot 默认集成- 支持自动热更新配置文件✅ (默认)Log4j2- 异步日志性能更强- 支持插件扩展- 防范漏洞能力更好❌ (需手动配置)JUL (JDK自带)- 无需额外依赖- 功能简单&am…...
后端之JPA(EntityGraph+JsonView)
不同表之间的级联操作或者说关联查询是很多业务场景都会用到的。 对于这种需求最朴素的方法自然是手动写关联表,然后对被关联的表也是手动插入数据。但是手写容易最后写成一堆shit代码,而且修改起来也是非常麻烦的。 学会使用现成的工具还是非常有利的…...
点击修改按钮图片显示有问题
问题可能出在表单数据的初始化上。在 ave-form.vue 中,我们需要处理一下从后端返回的图片数据,因为它们可能是 JSON 字符串格式。 vue:src/views/tools/fake-strategy/components/ave-form.vue// ... existing code ...Watch(value)watchValue(v: any) …...
Linux第一个小程序-进度条 (linux第七课)
目录 知识补充: 随机数的使用,先用srand(time(NULL))种时间种子 函数指针 模拟进度条代码 知识补充: \r只是回车 \r\n是回车加换行,其中\n带有强制换行的功能 如果只使用\r ,还需要刷新缓冲区(fflush(stdout)) %2d是左对齐 %-2d是右对齐 %.1lf是小数点后保留一位 随机数的使…...
iOS指纹归因详解
iOS 指纹归因(Fingerprint Attribution)详解 1. 指纹归因的概念 指纹归因(Fingerprint Attribution)是一种无 ID 归因(ID-less Attribution)技术,主要用于广告跟踪、用户识别或流量分析。它基…...
【Erdas实验教程】009:非监督分类及分类后评价
文章目录 一、分类过程二、分类评价ERDAS 的 ISODATA 算法是基于最小光谱距离来进行的非监督分类,聚类过程始于任意聚类平均值或一个已有分类模板的平均值;聚类每重复一次,聚类的平均值就更新一次,新聚类的均值再用于下次聚类循环。这个过程不断重复,直到最大的循环次数已…...
DeepSeek+Kimi生成高质量PPT
DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用:生成结构化PPT大纲(擅长逻辑构建与内容优化)Kimi核心作用:将文本转换为视觉化PPT(提供模板库与排版引擎) 二、操作步骤详解 1. 通…...
conda 基本命令
1、查询当前所有的环境 conda env list 2、创建虚拟环境 conda create -n 环境名 [pythonpython版本号] 其中[pythonpython版本号]可以不写 conda create -n test python3.12 我们输入conda env list看到我们的环境创建成功了,但是发现他是创建在我们默认的C盘的…...
网站搭建wp
前置准备工作 需要下载Git,note.js,在官网上可以搜索并安装 搭建过程 这里借助hexo工具 1. 本地博客搭建 首先创建本地文件夹,并在该文件夹里面创建一个叫做hexo的文件夹在该文件夹中选择Git Bash 进入hexo官网将五条指令用bash运行运行…...
什么是图传技术?
1.什么是图传技术? 图传技术(图像传输技术)是指将摄像头或其他图像采集设备捕获的实时画面,通过无线通信方式传输到接收端(如遥控器、显示屏、云端服务器等)的技术。它广泛应用于无人机、安防监控、直播设…...
Python数据结构高级:图的表示与遍历
Python数据结构高级:图的表示与遍历 一、图的基本概念 1.1 图的定义与分类 图(Graph)是由顶点(Vertex)集合和边(Edge)集合组成的数据结构,形式化表示为 G (V, E) 主要分类&…...
登录-10.Filter-登录校验过滤器
一.登录校验过滤器的实现思路 我们要实现登录校验过滤器,就要首先明白登录校验过滤器的实现思路。登录校验过滤器是用来实现登录校验的。那么首先思考第一个问题,所有的请求都需要校验吗? 答案是否定的,因为login请求就不需要过滤…...
《Keras 3 : 使用迁移学习进行关键点检测》:此文为AI自动翻译
《Keras 3 :使用迁移学习进行关键点检测》 作者:Sayak Paul,由 Muhammad Anas Raza 转换为 Keras 3 创建日期:2021/05/02 最后修改时间:2023/07/19 描述:使用数据增强和迁移学习训练关键点检测器。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 关键点检测包…...
【Deepseek】AnythingLLM + Ollama
1. 下载安装 anythingllm 下载地址:https://anythingllm.com/desktop 2. 启动anything 点击 Get started 3.创建工作空间 4.选择Ollama大语言模型 聊天设置 当前只有一个1.5b的模型 下载完成7b模型后 选择后记得点击更新到工作空间!&…...
VMware17下Ubuntu22.04设置本地共享文件夹
VMware17下使用Ubuntu22.04设置共享文件夹 在日常的开发与学习中,我们常常需要在主机(通常是Windows系统)和虚拟机(如Ubuntu 22.04)之间进行文件交换。为了简化这一过程,VMware提供了共享文件夹的功能&…...
【GreenHills】GHS合并库文件
1、 文档目标 解决Green Hills对于多个库文件合并问题 2、 问题场景 客户具有多个工程库文件。但是,客户想要在项目最终交付的时候,通过将多个库文件打包成一个库文件,进行交付。 3、软硬件环境 1)、软件版本:MULTI…...
mysql-统计表占内存大小
在 MySQL 中,统计表占用的内存大小(或者更准确地说,是表占用的磁盘空间大小)并非一个简单的任务,因为MySQL的数据存储涉及多种文件,包括数据文件、索引文件等。不过,有几种方法可以帮助你估算一…...
基于SpringBoot和Leaflet的邻省GDP可视化实战
目录 前言 一、技术实现路径 1、空间数据检索 2、数据展示检索流程 二、SpringBoot后台实现 1、模型层实现 2、控制层实现 三、WebGIS前端实现 1、控制面展示 2、成果展示 四、总结 前言 在数字化浪潮席卷全球的今天,数据已成为驱动社会经济发展、指导政策…...
DeepSeek-R1本地部署保姆级教程
一、DeepSeek-R1本地部署配置要求 (一)轻量级模型 ▌DeepSeek-R1-1.5B 内存容量:≥8GB 显卡需求:支持CPU推理(无需独立GPU) 适用场景:本地环境验证测试/Ollama集成调试 (二&a…...
DeepSeek + Mermaid编辑器——常规绘图
下面这张图出自:由清华大学出品的 《DeepSeek:从入门到精通》。 作为纯文本生成模型,DeepSeek虽不具备多媒体内容生成接口,但其开放式架构允许通过API接口与图像合成引擎、数据可视化工具等第三方系统进行协同工作,最终…...
推送项目 之 解决冲突
文章目录 为什么会发生冲突?如何解决这些冲突?1. **查看冲突文件**2. **解决二进制文件冲突**3. **解决文本文件冲突**4. **标记冲突已解决**5. **完成合并**6. **推送更改** 注意事项总结 问题:我们在git pusll拉取远程仓库的代码到本地对比…...
蓝桥杯——lcd显示
一:复制文件 从官方参考文件中复制相关文件,Src中的lcd.c,Inc中的lcd.h,fonts.h复制到自己创建的文件中 二:lcd初始化 在lcd.h中找到四个初始化函数,将其写到main文件中 三:写lcd显示函数 在…...
1_安装JDK和Hadoop
一、解压jdk和hadoop安装包 下载 通过百度网盘分享的文件:jdk-8u172-linux-x64.tar.gz 链接:https://pan.baidu.com/s/1VjhdpfyqdC7ivEBIjTn8tA 提取码:iz25 二、配置环境变量 vi /root/.bashrc添加 #set java environment export JAVA_H…...
angular简易计算器
说明: 用angular实现计算器效果,ui风格为暗黑 效果图: step1: C:\Users\Administrator\WebstormProjects\untitled4\src\app\calnum\calnum.component.ts import { Component } from angular/core;Component({selector: app-calnum,import…...
python 程序
gif调整尺寸.py import sys from PIL import Image,ImageSequence import os ##print(sys.argv[0]) ##print(sys.argv[1]) def gifresize(file_name): gf Image.open(file_name) ## lifetime gf.info[duration] imglist [] imgnew [] for i in ImageSequence.…...
vue3响应式数据原理
Vue 3 的响应式系统与 Vue 2 有显著不同,Vue 3 使用了 Proxy 替代了 Vue 2 中的 Object.defineProperty,这使得 Vue 3 的响应式系统更加灵活和强大 Vue 3 响应式原理的核心 Proxy: Vue 3 使用 Proxy 来拦截对象的操作(如读取、赋值…...