设计模式Python版 命令模式(上)
文章目录
- 前言
- 一、命令模式
- 二、命令模式示例
前言
GOF设计模式分三大类:
- 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。
- 结构型模式:关注类和对象之间的组合,包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。
- 行为型模式:关注对象之间的交互,包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。
一、命令模式
命令模式(Command Pattern)
- 定义:
- 将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化
- 对请求排队或者记录请求日志
- 支持可撤销的操作
- 解决问题:如何将请求的发送者和请求的接收者完全解耦?
- 使用场景:
- 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
- 系统需要在不同的时间指定请求、将请求排队和执行请求。
- 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
- 系统需要将一组操作组合在一起形成宏命令。
- 组成:
- Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作。
- ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法。它对应具体的接收者对象,将接收者对象的动作绑定其中。在实现execute()方法时,将调用接收者对象的相关操作(Action)。
- Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的execute()方法,从而实现间接调用请求接收者的相关操作。
- Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理。
- 补充说明:
- 在软件开发中也存在很多与开关和电器类似的请求发送者和接收者对象。发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
- 在命令模式中,发送者与接收者之间引入了新的命令对象,将发送者的请求封装在命令对象中,再通过命令对象来调用接收者的方法。
- 命令模式的核心在于引入了命令类。请求发送者针对抽象命令类编程,只有实现了抽象命令类的具体命令才与请求接收者相关联。
- 通过命令类来降低发送者和接收者的耦合度,请求发送者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法。
- 命令模式的本质是对请求进行封装。一个请求对应于一个命令,将发出命令的责任和执行命令的责任分割开。
- 命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的。
- 命令模式是一种使用频率非常高的设计模式。
- 优点:
- 降低系统的耦合度。新的命令可以很容易地加入系统中。可以比较容易地设计一个命令队列或宏命令(组合命令)。为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案。
- 缺点:
- 可能会导致某些系统有过多的具体命令类。
二、命令模式示例
使用命令模式来设计“自定义功能键”模块,将功能键和相应功能自由绑定
- FunctionButton充当请求调用者,Command充当抽象命令类,MinimizeCommand和HelpCommand充当具体命令类,WindowHandler和HelpHandler充当请求接收者。
- FBSettingWindow是“功能键设置”界面类
### 命令模式
"""请求发送者"""class FunctionButton:def __init__(self, name: str):self.name = name # 功能键名称self.cmd: Cmd = None # 抽象命令对象的引用def on_click(self):# 发送请求print("点击功能键:", end="")self.cmd.execute()"""请求接收者"""class WindowHandler:# 窗口处理def minimize(self):print("将窗口最小化到托盘!")class HelpHandler:# 帮助文档处理def display(self):print("显示帮助文档!")"""抽象命令类"""class Cmd:def execute(self):raise NotImplementedError"""具体命令类"""class MinimizeCmd(Cmd):# 最小化命令def __init__(self):self.wh_obj = WindowHandler()def execute(self):# 命令执行:调用请求接收者的业务方法self.wh_obj.minimize()class HelpCmd(Cmd):# 帮助命令def __init__(self):self.hh_obj = HelpHandler() # 请求接收者的引用def execute(self):# 命令执行:调用请求接收者的业务方法self.hh_obj.display()"""功能键设置界面"""class FBSettingWindow:def __init__(self, title: str):self.title = title # 窗口标题self.function_buttons: list[FunctionButton] = [] # 存储所有功能键def add_function_button(self, fb: FunctionButton):if fb not in self.function_buttons:self.function_buttons.append(fb)def remove_function_button(self, fb: FunctionButton):if fb in self.function_buttons:self.function_buttons.remove(fb)def display(self):# 显示窗口及功能键print(f"显示窗口:{self.title}")print("显示功能键:")for i in self.function_buttons:print(i.name)print("#" * 10)
- 为了提高系统的灵活性和可扩展性,这里将具体命令类的类名存储在配置文件command_conf.json中,并通过工具类XMLUtil来读取配置文件并反射生成对象。JsonUtil类的代码如下:
# 模块 utils.py
from pathlib import Path
import jsonclass JsonUtil:@staticmethoddef get_value(key: str, conf_file="config.json"):"""读取配置文件,返回配置文件中的配置"""path = Path(conf_file)contents = path.read_text(encoding="utf-8")conf = json.loads(contents)return conf.get(key, None)
- 配置文件command_conf.json中存储了具体命令类的类名,代码如下:
{"class_name_1": "HelpCmd","class_name_2": "MinimizeCmd"
}
- 客户端代码
"""客户端代码"""from command import FBSettingWindow, FunctionButton, Cmd
from utils import JsonUtil
import command# 通过读取配置文件和反射生成具体命令对象
class_name_1 = JsonUtil.get_value("class_name_1", "command_conf.json")
class_name_2 = JsonUtil.get_value("class_name_2", "command_conf.json")
if class_name_1 is None or class_name_2 is None:raise ValueError
cmd1: Cmd = getattr(command, class_name_1)()
cmd2: Cmd = getattr(command, class_name_2)()
# 创建功能键并绑定功能
fb1 = FunctionButton("功能键1")
fb2 = FunctionButton("功能键2")
fb1.cmd = cmd1
fb2.cmd = cmd2
# 调用功能键的业务方法
fb1.on_click()
fb2.on_click()
# 显示窗口及功能键
fbsw = FBSettingWindow("功能键设置")
fbsw.add_function_button(fb1)
fbsw.add_function_button(fb2)
fbsw.display()
- 输出结果
点击功能键:显示帮助文档!
点击功能键:将窗口最小化到托盘!
显示窗口:功能键设置
显示功能键:
功能键1
功能键2
##########
- 如果需要修改功能键的功能,例如某个功能键可以实现“自动截屏”,只需要对应增加一个新的具体命令类。在该命令类与屏幕处理者(ScreenHandler)之间创建一个关联关系,然后将该具体命令类的对象通过配置文件注入某个功能键即可,原有代码无须修改,符合开闭原则。
您正在阅读的是《设计模式Python版》专栏!关注不迷路~
相关文章:
设计模式Python版 命令模式(上)
文章目录 前言一、命令模式二、命令模式示例 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对象之间的组合&…...
部署 DeepSeek R1各个版本所需硬件配置清单
DeepSeek-R1 通过其卓越的推理性能和灵活的训练机制,在 2025 年的春节期间受到了广泛关注。 DeepSeek-R1 是一款高性能的 AI 推理模型,主要通过强化学习技术来增强模型在复杂任务场景下的推理能力。 在本地部署 DeepSeek-R1 时,尤其是完整的…...
【NLP 21、实践 ③ 全切分函数切分句子】
当无数个自己离去,我便日益坦然 —— 25.2.9 一、jieba分词器 Jieba 是一款优秀的 Python 中文分词库,它支持多种分词模式,其中全切分方式会将句子中所有可能的词语都扫描出来。 1.原理 全切分方式会找出句子中所有可能的词语组合。对于一…...
pycharm如何对比两个文档
在 PyCharm 中对比两个文档,并使它们同步滚动,可以按照以下步骤操作: 在 PyCharm 的文件列表中右键点击需要对比的其中一个文件。选择 “Compares With” 选项。选择第二个文件进行对比。...
React 第二十五节 <Fragment></Fragment> 的用途以及使用注意事项详解
文章如果错误偏差,烦请及时批评指正 一、为什么要使用 <Fragment>? 因为在 React 中,组件必须返回单个根元素。当我们尝试直接返回相邻的 JSX 元素时: function BrokenComponent() {return (<h1>标题</h1><…...
探秘Hugging Face与DeepSeek:AI开源世界的闪耀双子星
目录 一、引言:AI 开源浪潮的澎湃二、Hugging Face:AI 开源社区的基石(一)起源与发展历程(二)核心技术与特色(三)在 AI 领域的广泛应用 三、DeepSeek:东方崛起的 AI 新势…...
centos 和 ubuntu 区别
一、发行版与支持 1. CentOS 是基于 Red Hat Enterprise Linux(RHEL)源代码重新编译而成的社区版,遵循开源协议。一般由社区进行维护,每 7 年左右发布一个主要版本,注重稳定性和长期支持,适合对系统稳定性…...
windows,docker停止所有容器
CMD命令窗口 你可以尝试使用以下命令来停止所有正在运行的Docker容器: FOR /f "tokens*" %i IN (docker ps -q) DO docker stop %i这条命令的工作原理是: docker ps -q 列出所有正在运行的容器的ID。 FOR /f "tokens*" %i IN (c…...
AI赋能前端性能优化:效率与体验的完美平衡
在当今快节奏的互联网世界中,用户体验至关重要。一个加载缓慢、反应迟钝的网站或应用,很容易导致用户流失。而前端性能优化,作为提升用户体验的关键环节,却常常面临着诸多挑战。复杂的代码逻辑、庞大的资源文件、以及难以捉摸的性…...
8、《5分钟构建RESTful API:Spring Boot Web开发入门》
5分钟构建RESTful API:Spring Boot Web开发入门 一、RESTful API核心认知 REST(Representational State Transfer)通过HTTP协议实现资源操作,其核心特征包括: 资源以URI标识(/api/users)通过…...
【Java八股文】01-Java基础面试篇
【Java八股文】01-Java基础面试篇 概念Java特点Java为什么跨平台JVM、JDK、JRE关系 面向对象什么是面向对象,什么是封装继承多态?多态体现的方面面向对象设计原则重载重写的区别抽象类和实体类区别Java抽象类和接口的区别抽象类可以被实例化吗 深拷贝浅拷…...
读取本地excel删除第一行,并生成List数组
在 pom.xml 里添加如下依赖: <dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.ap…...
【核心特性】Go 模块化开发入门(go mod 深度解析)
Go 模块化开发入门(go mod 深度解析) 一、引言 在 Go 语言的开发过程中,随着项目规模的不断扩大,依赖管理变得愈发重要。Go Modules 作为 Go 语言官方的依赖管理工具,自 Go 1.11 版本引入后,极大地简化了项…...
【新品解读】AI 应用场景全覆盖!解码超高端 VU+ FPGA 开发平台 AXVU13F
「AXVU13F」Virtex UltraScale XCVU13P Jetson Orin NX 继发布 AMD Virtex UltraScale FPGA PCIE3.0 开发平台 AXVU13P 后,ALINX 进一步研究尖端应用市场,面向 AI 场景进行优化设计,推出 AXVU13F。 AXVU13F 和 AXVU13P 采用相同的 AMD Vir…...
Flask和Django相比哪个更适合新手?
Flask 与 Django:哪个更适合新手? 对于新手来说,选择 Flask 还是 Django 主要取决于你的具体需求和项目复杂度。以下是两者的详细对比,帮助你做出选择: 1. Flask 优点 简单易用:Flask 是一个轻量级的微框架,代码简洁,易于理解和上手。适合初学者快速入门。灵活性高:…...
高通android WIFI debug
参考高通文档:80-76240-16_REV_AA_Wi-Fi_Debug_Techniques 大纲 一、 WLAN Debug Logs –logcat ■ Logcat log logcat is a command-line tool that dumps the log of system messages, ■ Including stack traces when the device throws an error. ■ Need t…...
ADC 的音频实验,无线收发模块( nRF24L01)
nRF24L01 采用 QFN20 封装,有 20 个引脚,以下是各引脚的详细介绍: 1. 电源引脚 ◦ VDD:电源输入端,一般接 3V 电源,为芯片提供工作电压,供电电压范围为 1.9V~3.6V。 ◦ VSS…...
Swagger2 Knife4jConfig 配置,父子项目swagger扫描多个子模块中的Controller生成接口文档:
问题: 需求父子项目swagger扫描多个子模块中的Controller生成接口文档: Swagger2Knife4jConfig 配置放在了 springboot-app 启动项目里,而 tiger-web 和 tiger-web2 这两个子项目有自己的 Controller。这种情况下,Swagger 可能无法正确扫描 tiger-web 和…...
Unity UI 道路线跟随:让图标沿道路轨迹移动
在 Unity UI 开发中,有时需要让图标沿着一条道路轨迹移动,比如地图上的车辆行驶动画、导航路径指示等。本文介绍如何基于 UI 图片中的道路线生成曲线,并使用 Slider 控制图标沿轨迹运动,适用于 UI 导航、路径跟随动画等场景。 1. …...
Springboot核心:拦截器
拦截器是 Spring 框架提供的核心功能之一,属于一种设计模式,它允许在某个方法调用或请求处理前后执行自定义逻辑,是一种AOP(面向切面编程)机制。它们可以在不修改原有业务逻辑的情况下,对进入系统的请求进行预处理和后…...
【AI学习笔记】基于Unity+DeepSeek开发的一些BUG记录解决方案
【AI学习笔记】基于UnityDeepSeek开发的一些BUG记录&解决方案 背景前摇:(省流可不看) Unity是大学学的,AI是研究生学的,DeepSeek是第一份实习偷师的,三合一的梦是最近开始做的,BUG是今天遇…...
六西格玛设计培训如何破解风电设备制造质量与成本困局
2023年,中国风电行业装机容量突破4.3亿千瓦,稳居全球第一,但高速扩张背后暗藏隐忧: 质量痛点:叶片开裂、齿轮箱故障等缺陷频发,运维成本占项目全生命周期成本超30%;成本压力:原材料…...
xml 和json互转工具
工具1 有个问题会导致springboot返回捕获的异常编程xml格式 import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import org.json.JSONObject; import org.json.XML; import org.w3c.dom.Document;import javax.xm…...
【STM32】舵机SG90
1.舵机原理 舵机内部有一个电位器,当转轴随电机旋转,电位器的电压会发生改变,电压会带动转一定的角度,舵机中的控制板就会电位器输出的电压所代表的角度,与输入的PWM所代表的角度进行比较,从而得出一个旋转…...
【RK3588嵌入式图形编程】-SDL2-鼠标输入处理
鼠标输入处理 文章目录 鼠标输入处理1、概述2、鼠标移动事件3、鼠标点击事件4、鼠标点击位置5、鼠标双击6、鼠标进入和离开事件7、总结在本文中,将介绍如何在 SDL2 中检测和处理鼠标输入事件,包括鼠标移动、按钮点击以及窗口进入/退出。 1、概述 在本文中,我们将详细介绍如…...
知识管理成功:关键指标和策略,研究信息的投资回报率
信息过载会影响生产力。没有人工智能的帮助,信息过载会影响生产力。大量的可用信息,知识工作者不仅仅是超负荷工作;他们感到不知所措,他们倾向于浪费时间(和脑细胞)来应付他们被大量的数据抛向他们…...
Linux权限提升-内核溢出
一:Web到Linux-内核溢出Dcow 复现环境:https://www.vulnhub.com/entry/lampiao-1,249/ 1.信息收集:探测⽬标ip及开发端⼝ 2.Web漏洞利⽤: 查找drupal相关漏洞 search drupal # 进⾏漏洞利⽤ use exploit/unix/webapp/drupal_dr…...
Bootstrap5 折叠功能详解
Bootstrap5 折叠功能详解 引言 Bootstrap 是一个流行的前端框架,它提供了许多组件和工具,使得开发者可以轻松构建响应式网站。在 Bootstrap5 中,折叠(Collapse)组件得到了增强,使其更加灵活和易于使用。本…...
JAVA:Spring Boot 项目中自定义 Banner 的技术指南
1、简述 在 Spring Boot 项目中,当应用启动时会显示默认的 Spring 标志和版本信息。定制化的启动 Banner 不仅可以美化应用,还能在项目中增加个性化的品牌印记,甚至可以提供一些关键信息。本文将介绍如何在 Spring Boot 项目中自定义启动 Ba…...
【虚幻引擎UE】UE4.23到UE5.5的核心功能变化
简单总结从UE4.23到UE5.5,虚幻引擎的重大变化: 1. WebGL/HTML5 平台支持和像素流 UE4.23-UE4.25:移除官方HTML5支持,改为社区插件维护。 但通过第三方插件(如WebAssemblyWebGPU)可在浏览器运行部分项目。U…...
信号检测和信道均衡的联系
1. 系统模型 假设一个通信系统的数学模型如下: 发送信号: s [ s 1 , s 2 , … , s N ] T \mathbf{s} [s_1, s_2, \dots, s_N]^T s[s1,s2,…,sN]T,其中 s i s_i si 是发送符号。信道矩阵: H \mathbf{H} H(…...
在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档教程
既然我们已经在本地部署了DeepSeek,肯定希望能够利用本地的模型对自己软件开发、办公文档进行优化使用,接下来就先在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档的教程奉上。 前提: (1)已经部署好了DeepSeek,可以看我的文章:个人windows电脑上安装DeepSe…...
26、深度学习-自学之路-NLP自然语言处理-理解加程序,怎么把现实的词翻译给机器识别。
一、怎么能让机器能够理解我们的语言呢,我们可以利用神经网络干很多的事情,那么我们是不是也可以用神经元做自然语言处理呢,现在很多的实际应用已经说明了这个问题,可以这么做。 那我们考虑一下该怎么做,首先我们应该…...
微信服务号推送消息
这里如果 没有 就需要点新的功能去申请一下 申请成功之后就可以设置模版消息 推送到用户接受的页面是 需要后端调用接口 传递token 发送给客户...
Excel常用操作
Excel常用操作 学习资源 37_电子表格处理考点精讲_设置数据格式_哔哩哔哩_bilibili 快速输入数据与编辑数据 一个工作簿可以包含多个工作表 特殊数据的添加格式 输入负数, 例如-3、-5 常规输入, 直接输入-3、-5;使用(), 例如在单元格中输入(3)回车即可变为-3;上述括号不区分中…...
得物端智能视频封面推荐
一、背景 什么要做智能封面? 用户可以在得物购物,也可以在得物社区分享自己的生活。 得物社区中的视频使用双列流,每条内容包含封面、标题等。 对得物社区的创作者而言,选择视频封面是创作链路的重要环节。对得物社区的消费者…...
【Stable Diffusion部署至GNU/Linux】安装流程
以下是安装Stable Diffusion的步骤,以Ubuntu 22.04 LTS为例子。 显卡与计算架构介绍 CUDA是NVIDIA GPU的专用并行计算架构 技术层级说明CUDA Toolkit提供GPU编译器(nvcc)、数学库(cuBLAS)等开发工具cuDNN深度神经网络加速库(需单独下载)GPU驱动包含CUDA Driver(需与CUDA …...
介绍 Liquibase、Flyway、Talend 和 Apache NiFi:选择适合的工具
在现代软件开发中,尤其是在数据库管理和数据集成方面,选择合适的工具至关重要。本文将介绍四个流行的工具:Liquibase、Flyway、Talend 和 Apache NiFi,分析它们的应用、依赖以及如何选择适合的工具。 1. Liquibase 简介ÿ…...
Unity 接入Tripo 文生模型,图生模型
官方网站:https://www.tripo3d.ai/app/home自行注册账号并且登陆下载Unity插件:https://cdn-web.tripo3d.ai/plugin/tripo-unity.zip申请apikey: https://platform.tripo3d.ai/api-keys使用(后续过程就按照第二步下载的插件里面的…...
黑马Redis详细笔记(实战篇---短信登录)
目录 一.短信登录 1.1 导入项目 1.2 Session 实现短信登录 1.3 集群的 Session 共享问题 1.4 基于 Redis 实现共享 Session 登录 一.短信登录 1.1 导入项目 数据库准备 -- 创建用户表 CREATE TABLE user (id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,phone …...
Unity 增量打包AssetBundle
背景 打包太慢了,想要没改动的资源不重新打包浪费时间。 来源 官方文章:https://forum.unity.com/threads/about-incremental-build-and-asset-bundle-hashes.1436032/ 官网AB介绍:https://learn.unity.com/tutorial/assets-resources-and…...
前端 TypeError 错误永久消失术
作者:来自 vivo 互联网大前端团队- Sun Maobin 通过开发 Babel 插件,打包时自动为代码添加 可选链运算符(?.),从而有效避免 TypeError 的发生。 一、背景介绍 在 JS 中当获取引用对象为空值的属性时,程序会立即终止运行并报错&…...
【视频总结】Deep Dive into LLMs like ChatGPT 深入探索像ChatGPT这样的大语言模型|Andrej Karpathy
【视频总结】Deep Dive into LLMs like ChatGPT 深入探索像ChatGPT这样的大语言模型|Andrej Karpathy 大型语言模型(LLM)工作原理与使用指南核心观点模型训练三阶段1. 预训练阶段2. 后训练阶段(Post-training)3. 强化学…...
内网ip网段记录
1.介绍 常见的内网IP段有: A类: 10.0.0.0/8 大型企业内部网络(如 AWS、阿里云) 10.0.0.0 - 10.255.255.255 B类:172.16.0.0/12 中型企业、学校 172.16.0.0 - 172.31.255.255 C类:192.168.0.0/16 家庭…...
本地部署DeepSeek + AnythingLLM 搭建高效安全的个人知识库
环境准备: 本地部署方案请参考博客:windows平台本地部署DeepSeek大模型+Open WebUI网页界面(可以离线使用)-CSDN博客 windows平台本地部署DeepSeek大模型+Chatbox界面(可以离线使用)-CSDN博客 根据本人电脑配置:windows11 + i9-13900HX+RTX4060+DDR5 5600 32G内存 确…...
Xcode证书密钥导入
证书干嘛用 渠道定期会给xcode证书,用来给ios打包用,证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中,选择系统。(选登录也行,反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥ÿ…...
机械学习基础-5.分类-数据建模与机械智能课程自留
data modeling and machine intelligence - CLASSIFICATION 为什么我们不将回归技术用于分类?贝叶斯分类器(The Bayes Classifier)逻辑回归(Logistic Regression)对逻辑回归的更多直观理解逻辑 /sigmoid 函数的导数我们…...
springcloud集成gateway
本篇文章只介绍gateway模块的搭建步骤,并无gateway详细介绍 gateway详解请查看:SpringCloudGateway官方文档详解 前置处理 父模块中已指定版本 不知道如何选择版本看这篇: 手把手教你梳理springcloud与springboot与springcloudalibaba的版本…...
RocketMQ之偏移量Offset
偏移量:偏移量是 ConsumerQueue 文件中的逻辑位置,表示消息在队列中的顺序。每次消费通过偏移量在索引文件ConsumerQueue中快速找到对应的消息内容。 1.Broker端 Broker端主要通过ConsumerManageProcessor类来处理Offset的更新查询的请求,真…...
2024-2025年主流的开源向量数据库推荐
以下是2024-2025年主流的开源向量数据库推荐,涵盖其核心功能和应用场景: 1. Milvus 特点:专为大规模向量搜索设计,支持万亿级向量数据集的毫秒级搜索,适用于图像搜索、聊天机器人、化学结构搜索等场景。采用无状态架…...