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

【设计模式】【结构型模式】桥接模式(Bridge)

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD
🔥 2025本人正在沉淀中… 博客更新速度++
👍 欢迎点赞、收藏、关注,跟上我的更新节奏
🎵 当你的天空突然下了大雨,那是我在为你炸乌云

文章目录

  • 一、入门
    • 什么是桥接模式?
    • 为什么要用桥接模式?
    • 如何实现桥接模式?
  • 二、桥接模式在框架源码中的运用
    • JDBC(Java 数据库连接)
      • JDBC 桥接模式工作流程
      • JDBC 的源码实现
    • Spring Web MVC
  • 三、总结
    • 桥接模式的优点
    • 桥接模式的缺点
    • 桥接模式适用场景

一、入门

什么是桥接模式?

桥接模式(Bridge Pattern)是一种结构型设计模式,核心思想是将抽象与实现分离,让它们可以独立变化。简单来说,它像一座“桥”连接了两个维度的变化,避免用继承导致代码臃肿。

为什么要用桥接模式?

这次我以大家熟悉的支付系统为例,详细说明桥接模式如何解决现实中的问题。假设我们要实现一个支持不同支付方式(支付宝、微信)和不同支付渠道(国内支付、跨境支付)的系统。
传统实现:支付方式 × 渠道 = 类爆炸:以下为代码实现

// 支付宝国内支付
class AlipayDomestic {void pay() { System.out.println("支付宝国内支付:调用国内风控API");System.out.println("支付宝国内支付:人民币结算");}
}// 支付宝跨境支付
class AlipayCrossBorder {void pay() { System.out.println("支付宝跨境支付:调用国际风控API");System.out.println("支付宝跨境支付:美元结算");}
}// 微信国内支付
class WechatDomestic {void pay() { System.out.println("微信国内支付:调用国内风控API");System.out.println("微信国内支付:人民币结算");}
}// 微信跨境支付
class WechatCrossBorder {void pay() { System.out.println("微信跨境支付:调用国际风控API");System.out.println("微信跨境支付:美元结算");}
}// 如果新增一个银联支付,需要再写两个类...
// 如果新增一个支付渠道(如港澳台专线),需要为每个支付方式创建新类...

存在问题:

  1. 重复代码:国内/跨境支付的风控和结算逻辑被重复写在每个类中。
  2. 维护困难:修改国内支付的结算规则,需要改动所有相关类。
  3. 扩展性差:新增支付方式或渠道时,需要创建大量新类。

如何实现桥接模式?

桥接(Bridge)模式包含以下主要角色

  • 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
  • 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

【案例】桥接模式- 改
在这里插入图片描述

桥接模式解法:解耦支付方式与渠道

核心思想

  • 抽象部分:支付方式(支付宝、微信),关注用户侧操作。
  • 实现部分:支付渠道(国内、跨境),关注底层金融操作。

抽象化 (Abstraction): PaymentMethod类,定义高层抽象接口,持有实现层对象引用。

abstract class PaymentMethod {protected PaymentChannel channel; // 关键:桥接的核心public PaymentMethod(PaymentChannel channel) {this.channel = channel;}public final void pay() {channel.applyRiskControl(); // 调用实现层doPayment();                // 自身逻辑channel.settleFunds();      // 调用实现层}protected abstract void doPayment();
}

扩展抽象化 (Refined Abstraction)Alipay类、WechatPay类。实现并扩展抽象层的业务逻辑。

// 支付宝支付
class Alipay extends PaymentMethod {public Alipay(PaymentChannel channel) {super(channel);}protected void doPayment() {System.out.println("支付宝:扫码用户付款码,扣除余额");}
}// 微信支付
class WechatPay extends PaymentMethod {public WechatPay(PaymentChannel channel) {super(channel);}protected void doPayment() {System.out.println("微信:调用微信SDK,从零钱扣款");}
}

实现化 (Implementor)PaymentChannel接口。定义底层操作的接口规范(如风控和结算),独立于抽象层变化(支付方式如何变化不影响渠道实现)。

interface PaymentChannel {void applyRiskControl(); // 风控接口void settleFunds();      // 结算接口
}
具体实现化 (Concrete Implementor)DomesticChannel, CrossBorderChannel类。具体实现底层操作(如国内渠道的身份证验证),可独立扩展(新增渠道无需修改抽象层)。
// 国内支付渠道
class DomesticChannel implements PaymentChannel {public void applyRiskControl() {System.out.println("国内风控:验证身份证 + 银行卡绑定");}public void settleFunds() {System.out.println("结算:人民币入账,T+1到账");}
}// 跨境支付渠道
class CrossBorderChannel implements PaymentChannel {public void applyRiskControl() {System.out.println("跨境风控:验证护照 + 外汇管制检查");}public void settleFunds() {System.out.println("结算:美元入账,汇率转换,T+3到账");}
}

客户端

public class Client {public static void main(String[] args) {// 创建支付渠道(实现层)PaymentChannel domestic = new DomesticChannel();PaymentChannel crossBorder = new CrossBorderChannel();// 组合支付方式和渠道(抽象层)PaymentMethod alipayDomestic = new Alipay(domestic);PaymentMethod wechatCrossBorder = new WechatPay(crossBorder);// 执行支付alipayDomestic.pay();/* 输出:开始支付流程...国内风控:验证身份证 + 银行卡绑定支付宝:扫码用户付款码,扣除余额结算:人民币入账,T+1到账支付完成!*/wechatCrossBorder.pay();/* 输出:开始支付流程...跨境风控:验证护照 + 外汇管制检查微信:调用微信SDK,从零钱扣款结算:美元入账,汇率转换,T+3到账支付完成!*/}
}

这里肯定会有UU说,我好像用装饰器模式也能实现

确实,装饰器模式在某些场景下可能与桥接模式有相似之处,但它们的核心意图和适用场景有本质区别。让我通过对比来帮你理清这两种模式的区别,以及为什么在支付系统的例子中桥接模式更合适。

桥接模式装饰器模式
核心目的分离抽象与实现,让两个维度独立扩展动态地为对象添加额外功能
关系结构组合关系(横向扩展)嵌套装饰(纵向扩展)
适用场景多个正交变化的维度(如形状×渲染方式)需要动态叠加功能(如咖啡加糖、加奶)
设计重点解耦抽象层与实现层增强对象的功能

二、桥接模式在框架源码中的运用

JDBC(Java 数据库连接)

JDBC 桥接模式工作流程

加载驱动实现类(具体实现化)

Class.forName("com.mysql.cj.jdbc.Driver"); // 触发MySQL驱动的static块注册

获取抽象层接口(桥接器选择具体实现)

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password"
);
  • DriverManager根据URL jdbc:mysql: 找到MySQL驱动
  • 调用MySQL Driver.connect()方法,返回ConnectionImpl实例(但应用程序只看到Connection接口)

操作数据库(通过抽象层接口)

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
  • 无论底层是MySQL还是Oracle,代码完全一致

JDBC 的源码实现

桥接模式角色JDBC 中的对应组件具体职责
抽象化 (Abstraction)java.sql.Connection等接口定义数据库操作的高层抽象
扩展抽象化 (Refined Abstraction)无(直接使用接口)JDBC接口已足够抽象,无需扩展
实现化 (Implementor)java.sql.Driver接口 定义数据库驱动实现的规范
具体实现化 (Concrete Implementor)各数据库驱动实现类(如com.mysql.cj.jdbc.Driver)具体实现数据库连接和操作逻辑
桥接器 (Bridge)DriverManager连接抽象层和实现层的桥梁

抽象化 (Abstraction)

  • 对应组件:java.sql.ConnectionStatementPreparedStatement 等接口
  • 核心职责:
    • 定义数据库操作的抽象接口(如执行SQL、事务管理)
    • 完全独立于具体数据库(无论是MySQL还是Oracle,接口方法一致)
public interface Connection extends Wrapper, AutoCloseable {Statement createStatement() throws SQLException;PreparedStatement prepareStatement(String sql) throws SQLException;void commit() throws SQLException;// 其他数据库操作抽象方法...
}

实现化 (Implementor)

  • 对应接口:java.sql.Driver
  • 核心职责:
    • 定义数据库驱动的规范(如何连接数据库、创建连接对象)
    • 由各数据库厂商实现(如MySQL、Oracle、PostgreSQL)
public interface Driver {Connection connect(String url, Properties info) throws SQLException;boolean acceptsURL(String url) throws SQLException;// 其他驱动核心方法...
}

具体实现化 (Concrete Implementor)

  • 对应类:各数据库的驱动实现类
    • MySQL: com.mysql.cj.jdbc.Driver
    • Oracle: oracle.jdbc.OracleDriver
    • PostgreSQL: org.postgresql.Driver
  • 核心职责
    • 实现Driver接口,提供具体的数据库连接逻辑
    • 隐藏数据库底层差异(如MySQL的协议、Oracle的专有语法)
public class Driver extends NonRegisteringDriver implements java.sql.Driver {static {// 注册驱动到DriverManagerDriverManager.registerDriver(new Driver());}public Connection connect(String url, Properties info) throws SQLException {// 创建MySQL专属的ConnectionImpl对象return new ConnectionImpl(url, info);}
}

桥接器 (Bridge)

  • 对应类java.sql.DriverManager
  • 核心职责
    • 管理所有注册的数据库驱动(Driver实现类)
    • 根据URL选择合适的具体驱动,返回抽象层接口(如Connection

关键代码逻辑:

public class DriverManager {private static final List<Driver> drivers = new CopyOnWriteArrayList<>();// 注册驱动public static void registerDriver(Driver driver) {drivers.add(driver);}// 获取连接(核心桥接逻辑)public static Connection getConnection(String url, String user, String password) {for (Driver driver : drivers) {if (driver.acceptsURL(url)) {// 调用具体驱动的connect方法return driver.connect(url, properties);}}throw new SQLException("No suitable driver found for " + url);}
}

Spring Web MVC

桥接模式的应用

  • 抽象层:HandlerAdapter(处理器适配器接口)
  • 实现层:不同处理器类型的适配器(如RequestMappingHandlerAdapter
// 抽象层:HandlerAdapter接口
public interface HandlerAdapter {boolean supports(Object handler);ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}// 实现层:RequestMappingHandlerAdapter
public class RequestMappingHandlerAdapter implements HandlerAdapter {public boolean supports(Object handler) {return handler instanceof HandlerMethod;}public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 处理@RequestMapping注解的方法}
}

桥接模式的作用

  • 解耦:DispatcherServlet通过HandlerAdapter调用处理器,无需关心具体处理器的类型(如@ControllerHttpRequestHandler)。
  • 扩展性:新增处理器类型只需实现HandlerAdapter接口,无需修改DispatcherServlet

三、总结

桥接模式的优点

  1. 解耦抽象与实现
    • 抽象层和实现层可以独立变化,互不影响。
    • 例如,JDBC中Connection接口(抽象层)和Driver实现(实现层)可以分别扩展。
  2. 提高扩展性
    • 新增抽象类或实现类时,无需修改现有代码,符合开闭原则。
    • 例如,新增数据库驱动只需实现Driver接口,无需修改JDBC核心代码。
  3. 减少类爆炸
    • 通过组合代替继承,避免了多层继承导致的类数量暴增。
    • 例如,支付系统中支付方式和支付渠道的组合只需M+N个类,而不是M×N个类。
  4. 运行时动态绑定
    • 可以在运行时动态切换实现。
    • 例如,JDBC中DriverManager根据URL动态选择具体的数据库驱动。
  5. 隐藏实现细节
    • 客户端只依赖抽象接口,无需关心具体实现。
    • 例如,应用程序只使用Connection接口,无需关心底层是MySQL还是Oracle。

桥接模式的缺点

  1. 增加系统复杂性
    • 需要额外设计抽象层和实现层,增加了代码量和理解难度。
    • 对于简单场景,可能显得过度设计。
  2. 设计难度较高
    • 需要准确识别系统中独立变化的维度,设计不当可能导致模式滥用。
    • 例如,如果错误地将两个强耦合的维度分离,反而会增加维护成本。
  3. 性能开销
    • 由于抽象层和实现层通过组合连接,可能会引入额外的间接调用,带来轻微的性能开销。

桥接模式适用场景

  1. 多个独立变化的维度
    • 当系统中存在两个或多个正交变化的维度,且每个维度都可能独立扩展时。
    • 经典案例:
      • 支付系统:支付方式 × 支付渠道
      • 图形库:形状 × 渲染方式
      • 跨平台UI框架:UI组件 × 操作系统API
  2. 避免多层继承
    • 当使用继承会导致类数量爆炸时,桥接模式是更好的选择。
    • 经典案例:
      • JDBC:Connection接口 × 数据库驱动
      • 物流系统:运输方式 × 物流公司
  3. 运行时切换实现
    • 当需要在运行时动态切换实现时。
    • 经典案例:
      • 日志框架:日志接口 × 日志实现(Logback、Log4j)
      • 消息通知系统:通知类型 × 发送渠道(短信、邮件、App推送)
  4. 隐藏实现细节
    • 当需要对外暴露简洁的接口,同时隐藏复杂的实现细节时。
    • 经典案例:
      • 数据库连接池:连接池接口 × 具体连接池实现(HikariCP、Druid)
      • 缓存框架:缓存接口 × 缓存实现(Redis、Memcached)

相关文章:

【设计模式】【结构型模式】桥接模式(Bridge)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…...

1997-2019年各省进出口总额数据

1997-2019年各省进出口总额数据 1、时间&#xff1a;1997-2020年 2、来源&#xff1a;国家统计局、各省年鉴 3、指标&#xff1a;进出口总额 4、范围&#xff1a;31省 5、指标解释&#xff1a;进出口总额‌是指以货币表示的一定时期内一国实际进出口商品的总金额&#xff…...

AI前端开发效率革命:拥抱AI,开启前端开发新纪元

前端开发行业竞争日益激烈&#xff0c;项目交付周期不断缩短&#xff0c;对开发效率的要求也越来越高。在这种高压环境下&#xff0c;开发者们常常面临着巨大的压力。而近年来&#xff0c;人工智能技术的飞速发展&#xff0c;特别是AI写代码工具的出现&#xff0c;为前端开发带…...

Rust编程语言入门教程(一)安装Rust

目录 引言一、为什么要用 Rust&#xff1f;二、与其他语言比较三、Rust 特别擅长的领域四、Rust 与 Firefox五、Rust 的用户和案例六、Rust 的优缺点七、安装 Rust1、访问官网下载 Rust2、下载完成&#xff0c;执行exe文件 八、Rust 安装验证九、开发工具结束语 引言 在当今快…...

Kubernetes控制平面组件:Kubernetes如何使用etcd

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

2025年-G4-Lc78--121. 买卖股票的最佳时机--(java版)

1.题目描述 2.思路 思路1: 做两轮排序&#xff0c;第一轮排序找到最小的那个数&#xff0c;然后再判断最小的那个数之后还有其他数吗&#xff0c;如果有在进行排序&#xff0c;选出最大的那个数&#xff0c;然后值相减。 问题要点&#xff1a; &#xff08;1&#xff09;你需要…...

LabVIEW 中的 3dgraph.llb 库

3dgraph.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下&#xff0c;是 LabVIEW 系统中用于 3D 图形相关操作的重要库。它为 LabVIEW 用户提供了丰富的功能&#xff0c;能在应用程序中创建、显示和交互各种 3D 图形&#xff0c;…...

通过VSCode直接连接使用 GPT的编程助手

GPT的编程助手在VSC上可以直接使用 选择相应的版本都可以正常使用。每个月可以使用40条&#xff0c;超过限制要付费。 如下图对应的4o和claude3.5等模型都可以使用。VSC直接连接即可。 配置步骤如下&#xff1a; 安装VSCODE 直接&#xff0c;官网下载就行 https://code.vis…...

[LeetCode力扣hot100]-C++常用数据结构

0.Vector 1.Set-常用滑动窗口 set<char> ans;//根据类型定义&#xff0c;像vector ans.count()//检查某个元素是否在set里&#xff0c;1在0不在 ans.insert();//插入元素 ans.erase()//删除某个指定元素 2.栈 3.树 树是一种特殊的数据结构&#xff0c;力扣二叉树相…...

2-安装YIUI

YIUI框架&#xff1a;GitHub - LiShengYang-yiyi/YIUI: Unity3D UGUI Framework, 基于UI数据事件绑定为核心 数据驱动的UGUI框架, ETUI框架, ET框架官方推荐UI框架 ET框架&#xff1a;egametang/ET: Unity3D Client And C# Server Framework (github.com) 1 - 安装YIUI框架&a…...

16-使用QtChart创建动态图表:入门指南

QtChart是Qt框架中的一个强大模块&#xff0c;用于创建各种类型的图表&#xff0c;如折线图、柱状图、饼图等。它提供了丰富的API和灵活的配置选项&#xff0c;使得开发者能够轻松地将数据可视化集成到应用程序中。本文将介绍如何使用QtChart创建一个简单的动态折线图&#xff…...

蓝耘智算携手DeepSeek,共创AI未来

&#x1f31f; 各位看官号&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习如何通过蓝耘智算使用DeepSeek R1模型 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&a…...

具身智能在智能巡检机器人中的应用——以开关柜带电操作机器人为例

随着机器人技术和人工智能的迅速发展&#xff0c;具身智能在各行业的应用日益广泛&#xff0c;尤其是在电力行业中的智能巡检领域。传统的电力巡检和维护工作通常需要人工操作&#xff0c;存在着高温、高压、强电磁场等危险环境&#xff0c;且效率较低。开关柜带电操作机器人作…...

【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.6 RNN与LSTM的变体与发展趋势】

引言:时间序列的魔法钥匙 在时间的长河中,信息如同涓涓细流,绵延不绝。而如何在这无尽的数据流中捕捉、理解和预测,正是循环神经网络(RNN)及其变体长短时记忆网络(LSTM)所擅长的。今天,我们就来一场深度探索,揭开RNN与LSTM的神秘面纱,看看它们如何在时间序列的海洋…...

【R语言】回归分析与判别分析

一、线性回归分析 1、lm()函数 lm()函数是用于拟合线性模型&#xff08;Linear Models&#xff09;的主要函数。线性模型是一种统计方法&#xff0c;用于描述一个或多个自变量&#xff08;预测变量、解释变量&#xff09;与因变量&#xff08;响应变量&#xff09;之间的关系…...

git开发流程以及github社区企业版

常规开发流程 1、将仓库 clone 到本地&#xff0c;已经 clone 的要 fetch & pull&#xff0c;保证本地 master 分支已经更新到最新状态 2、在 master 最新分支的基础上 checkout 一个开发分支&#xff0c;分支命名要求规范&#xff0c;如带用户名、日期、bug id 等关键信…...

DeepSeek + Vue实战开发

利用DeepSeek V3模型、siliconflow大模型一站式云服务平台以及vue3.0实现一个在线人工智能客服对话系统。 因为deepseek官网的api密钥使用起来比较缓慢&#xff0c;所以可以使用第三方的&#xff0c;具体操作请自行查阅资料。 siliconflow官网 SiliconFlow, Accelerate AGI …...

从安装软件到flask框架搭建可视化大屏(二)——创建一个flask页面,搭建可视化大屏,零基础也可以学会

附录&#xff1a;所有文件的完整代码 models.py # models/models.py from flask_sqlalchemy import SQLAlchemydb SQLAlchemy()class User(db.Model):__tablename__ user # 显式指定表名为 userid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(…...

Python编程中,async/await/asyncio分别是干啥的?

在Python异步编程中,async、await和asyncio是三个核心概念。它们共同构成了Python处理高并发I/O密集型任务的解决方案。本文将通过代码实例解析它们的作用和用法。 一、异步编程基础 1.1 同步 vs 异步 同步编程:代码按顺序执行,遇到I/O操作(如网络请求、文件读写)时会阻塞…...

vue非组件的初学笔记

1.创建Vue实例&#xff0c;初始化渲染的核心 准备容器引包创建Vue实例new Vue() el用来指定控制的盒子data提供数据 2.插值表达式 作用利用表达式插值&#xff0c;将数据渲染到页面中 格式{{表达式}} 注意点 表达式的数据要在data中存在表达式是可计算结果的语句插值表达式…...

4.3 学习UVM中的“run_phase“,将其应用到具体案例分为几步?

文章目录 前言1. run_phase 的作用与执行特点2. 关键组件的 run_phase 实现2.1 Driver 的 run_phase&#xff1a;驱动事务2.2 Monitor 的 run_phase&#xff1a;捕获事务2.3 Scoreboard 的 run_phase&#xff1a;数据比对 3. 同步与 Objection 管理3.1 控制仿真结束3.2 多组件协…...

[Python人工智能] 五十.PyTorch入门 (5)快速搭建神经网络及模型保存

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解PyTorch构建分类神经网络。这篇文章将介绍如何利用PyTorch快速构建神经网络,之前的代码比较复杂,通过自定义Net类实现,本文通过Torch函数定义神经网络。前面我们的Python人工智能主要以Tens…...

【C语言】有序数组的平方

文章目录 给你一个按非递减顺序排序的整数数组 nums&#xff0c;返回每个数字的平方组成的新数组&#xff0c;要求也按非递减顺序排序。 #include<stdio.h>/*** brief 计算一个整数数组的平方&#xff0c;并按非递减顺序存放结果* * 该函数接受一个整数数组arr和其长度le…...

osgearth视点坐标及鼠标交点坐标的信息显示(七)

核心函数如下: void COSGObject::addViewPointLabel() {//mRoot->addChild(osgEarth::Util::Controls::ControlCanvas::get(mViewer));//放开这句,球就卡住了。 为什么,shitosgEarth::Util::Controls::ControlCanvas* canvas = osgEarth::Util::Controls::ControlCanvas…...

【096】基于51单片机红外线人数统计系统【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成&#xff1a;51单片机最小系统LCD1602液晶显示两路E18-D80NK红外线传感器DS1302时钟芯片AT24C02存储芯片蜂鸣器LED灯按键设置。 1、设计采用STC89C52、AT89C52、AT89S52作为主控芯片&#xff1b; 2、采用DS1302时钟芯片实现对日期和时间的计时&#xff0c;并…...

【ENSP】链路聚合的两种模式

【ENSP】链路聚合的两种模式 1、背景介绍2、链路聚合的使用场景3、配置过程1、手工模式Eth-Trunk配置2、静态LACP模式Eth-Trunk 4、总结 1、背景介绍 随着网络规模的不断扩大&#xff0c;人们对骨干链路的带宽吞吐量和可靠性提出了越来越高的要求。在传统方案中&#xff0c;为…...

机器学习_17 K近邻算法知识点总结

K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;KNN&#xff09;是一种简单而直观的机器学习算法&#xff0c;广泛应用于分类和回归任务。它通过寻找训练集中与新样本最接近的K个样本&#xff08;近邻&#xff09;来进行预测。今天&#xff0c;我们就来深入探讨K近邻算法…...

Web 后端 请求与响应

一 请求响应 1. 请求&#xff08;Request&#xff09; 客户端向服务器发送的HTTP请求&#xff0c;通常包含以下内容&#xff1a; 请求行&#xff1a;HTTP方法&#xff08;GET/POST等&#xff09;、请求的URL、协议版本。 请求头&#xff08;Headers&#xff09;&#xff1a;…...

网络工程师 (44)ARP协议

前言 ARP协议&#xff0c;即地址解析协议&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是一种网络协议&#xff0c;主要用于将网络层的IPv4地址&#xff08;逻辑地址&#xff09;解析为链路层的物理地址&#xff08;通常是MAC地址&#xff09;。 一、基本概…...

使用verilog 实现 cordic 算法 ----- 旋转模式

1-设计流程 ● 了解cordic 算法原理&#xff0c;公式&#xff0c;模式&#xff0c;伸缩因子&#xff0c;旋转方向等&#xff0c;推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现&#xff0c;注意…...

搜狗浏览器卸载教程

需求背景 今天发现geek居然无法卸载搜狗浏览器&#xff0c;作为一个老司机&#xff0c;这是不允许的。如果你使用geek或者windows的卸载&#xff0c;或者直接在它的安装包的Uninstall.exe中卸载&#xff0c;他走到100%就一直不动了。那玩意是假的。 卸载教程 结束 -----华丽的…...

ES7 (ES2016) 新特性

目录 Array.prototype.includes()指数运算符与 ES6 的对比实际应用场景最佳实践 Array.includes() 基本语法 array.includes(searchElement[, fromIndex])特点 返回布尔值可以检测 NaN支持可选的 fromIndex 参数比 indexOf() 更语义化 使用示例 const numbers [1, 2, 3…...

设计模式13:职责链模式

系列总链接&#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客 1.概述 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它允许将请求沿着处理者链传递&#xff0c;直到有一个处理者能够处理该请求。这种模式通过…...

MongoDB between ... and ... 操作

个人博客地址&#xff1a;​​​​​​​MongoDB between ... and ... 操作 | 一张假钞的真实世界 MongoDB中类似SQL的between and操作可以采用如下语法&#xff1a; db.collection.find( { field: { $gt: value1, $lt: value2 } } );...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_alloc函数

ngx_alloc 声明在 src\os\unix\ngx_alloc.h 中&#xff1a; void *ngx_alloc(size_t size, ngx_log_t *log); 定义在 src\os\unix\ngx_alloc.c 中&#xff1a; void * ngx_alloc(size_t size, ngx_log_t *log) {void *p;p malloc(size);if (p NULL) {ngx_log_error(NGX_LOG_…...

总结:Helm 命令详解

文章目录 1. Helm 概述2. Helm 的安装与配置2.1 安装 Helm2.2 验证安装 3、Helm 的常用命令3.1 查看帮助3.2 查看 Chart 列表3.3 安装 Chart3.4 卸载 Chart3.5 升级 Chart3.6 回滚 Chart3.7 查看 Chart 详细信息3.8 查看 Chart 的模板3.9 查看 Chart 的值3.10 管理仓库 4. Helm…...

通俗诠释 DeepSeek-V3 模型的 “671B” ,“37B”与 “128K”,用生活比喻帮你理解模型的秘密!

欢迎来到涛涛聊AI。 在DeepSeek-V3模型的参数描述中&#xff0c;你可能会看到类似“671B 37B 128K”这样的标记。这些字母和数字的组合看起来像密码&#xff0c;但其实它们揭示了模型的“大脑容量”和“工作方式”。我们用日常生活的比喻来解释&#xff1a; 一、数字含义&…...

【鸿蒙ArcTS】TypeScript学习记录:函数类型声明与箭头函数

普通函数 function add(x: number, y: number): number {return x y; } 完整未省略版本 const add: (x: number, y: number) > void//函数类型(x: number, y: number): void > {//函数定义console.log("object"); };函数类型&#xff1a; type trigFunc…...

基于 Python 和 Django 的北极星招聘数据可视化系统(附源码,部署)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

机器学习_18 K均值聚类知识点总结

K均值聚类&#xff08;K-means Clustering&#xff09;是一种经典的无监督学习算法&#xff0c;广泛应用于数据分组、模式识别和降维等领域。它通过将数据划分为K个簇&#xff0c;使得簇内相似度高而簇间相似度低。今天&#xff0c;我们就来深入探讨K均值聚类的原理、实现和应用…...

LTE参数

RSRP(Reference Singnal Received Power&#xff0c;参考信号接收功率) 是终端接收到的小区公共参考信号(CRS)功率值&#xff0c;数值为测量带宽内单个RE功率的线性平均值&#xff0c;反映的是本小区有用信号的强度。 SINR(SignaltoInterference&Noise Ratio&#xff0c;…...

Word写论文常用操作的参考文章

1.插入多个引用文献&#xff1a;word中交叉引用多篇参考文献格式[1-2]操作以及显示错误问题 更改左域名&#xff0c;输入 \#"[0" 更改右域名&#xff0c;输入 \#"0]" 2.插入题注&#xff1a;word 中添加图片题注、目录、内部链接 3.插入公式编号&#x…...

kubectl exec 实现的原理

kubectl exec 是 Kubernetes 提供的一个命令&#xff0c;它允许你在指定的 Pod 中执行命令&#xff0c;类似于在容器中打开一个终端会话。这个功能对于调试、监控和管理容器化应用非常有用。kubectl exec 的实现涉及到多个 Kubernetes 组件和机制&#xff0c;包括 API Server、…...

apache artemis安装

安装apache artemis https://xxzkid.github.io/2025/apache-artemis-install...

驱动开发、移植(最后的说法有误,以后会修正)

一、任务明确&#xff1a;把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作&#xff0c; sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…...

算法12-贪心算法

一、贪心算法概念 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致全局最优解的算法。贪心算法的核心思想是“局部最优&#xff0c;全局最优”&#xff0c;即通过一系列局部最优选择&#xff0c;最…...

Docker容器化 | 超简单部署 FireCrawl

灵感来源 【RAG实战】Docker容器化 &#x1f525; FireCrawl | 基于docker-compose.yaml一键运行的网页解析API 参考仓库地址 建议给大佬点点star&#xff0c;这么简单的教程非常实用 测试环境 ubuntu 24.04 可能要安装的依赖 sudo apt install docker-buildx拉取FireCra…...

从入门到精通:Postman 实用指南

Postman 是一款超棒的 API 开发工具&#xff0c;能用来测试、调试和管理 API&#xff0c;大大提升开发效率。下面就给大家详细讲讲它的安装、使用方法&#xff0c;再分享些实用技巧。 一、安装 Postman 你能在 Postman 官网&#xff08;https://www.postman.com &#xff09;下…...

yolo11s rknn无法detect的bugfix - step by step

1.缘起 上周四下班时&#xff0c;发现在宿主机环境工作良好的既有的pytorch模型&#xff0c;在通过.pt->.onnx->.rknn的转换后无法正常工作。周五下班时&#xff0c;怀疑疑点在两处&#xff1a; 版本匹配问题通道和参数传递问题。 周六&#xff0c;周日&#xff0c;周…...

把 CSV 文件摄入到 Elasticsearch 中 - CSVES

在我们之前的很多文章里&#xff0c;我有讲到这个话题。在今天的文章中&#xff0c;我们就提重谈。我们使用一种新的方法来实现。这是一个基于 golang 的开源项目。项目的源码在 https://github.com/githubesson/csves/。由于这个原始的代码并不支持 basic security 及带有安全…...