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

13.组合模式:思考与解读

原文地址:组合模式:思考与解读  更多内容请关注:7.深入思考与解读设计模式

引言

在软件开发中,是否曾经遇到过这样一种情况:你有一个对象,它本身很简单,但是它包含了其他类似的对象。随着系统变得越来越复杂,可能会形成多层次的层级结构。你是否觉得,这种层级结构的管理和维护可能会变得越来越麻烦?如果你需要处理这些对象,是否可以通过某种方式以统一的方式对待它们?

组合模式正是为了解决这个问题而设计的。它让你能够将多个对象组合成树形结构,作为一个整体来操作,从而提供了灵活的管理方式。你是否觉得,这种模式能够使得树形结构的对象管理更加清晰和简化?

在本文中,我们将通过一系列问题,逐步引导你理解组合模式的核心思想、应用场景以及如何实现它。

什么是组合模式?

问题1:当你遇到树形结构的对象(如文件夹和文件、部门和员工等)时,你是如何组织和管理这些对象的?

假设你正在开发一个文件管理系统,其中有文件夹和文件。每个文件夹可能包含其他文件夹和文件。你是如何组织这些对象的?是否每次都需要分别处理文件和文件夹,分别使用不同的逻辑?

问题2:在层次化的结构中,你是否觉得需要有一种方式来将叶子节点和中间节点统一对待?如果可以统一操作它们,是否能让你的代码更加简洁?

组合模式通过将对象组织成树形结构,使得每个对象无论是“叶子节点”(基本对象)还是“中间节点”(容器对象)都可以用相同的方式来处理。你是否觉得,统一的操作方式会简化代码,让系统更加灵活?

组合模式的核心概念

问题3:组合模式的核心思想是什么?它是如何通过将对象组织成树形结构来实现的?

组合模式的核心思想是:让树形结构的对象(如文件夹和文件)有相同的接口,容器对象(如文件夹)和叶子节点对象(如文件)可以一致地进行处理。你能理解,为什么这种设计可以让我们通过统一的方式来操作不同层次的对象吗?

问题4:在组合模式中,如何定义抽象组件、叶子节点和容器节点?它们各自的角色是什么?

在组合模式中,通常有三个主要角色:

  1. 抽象组件(Component):定义所有节点的公共接口,让叶子节点和容器节点有统一的操作方式。

  2. 叶子节点(Leaf):实际的对象,没有子节点,执行具体的操作。

  3. 容器节点(Composite):有子节点的对象,可以包含其他叶子节点或容器节点。

你能理解这三个角色如何共同工作,使得组合模式能够统一操作树形结构中的对象吗?

组合模式的实现

假设你正在开发一个文件管理系统,其中包括文件(叶子节点)和文件夹(容器节点)。我们将使用组合模式来实现它。

步骤1:定义抽象组件类

from abc import ABC, abstractmethod# 抽象组件类:定义统一的操作接口
class FileSystemComponent(ABC):@abstractmethoddef show(self):pass

问题5:为什么我们需要定义一个抽象组件类(FileSystemComponent)?它是如何统一文件和文件夹的操作接口的?

FileSystemComponent接口定义了所有文件系统组件的共同方法。通过这个统一的接口,无论是文件(叶子节点)还是文件夹(容器节点),我们都可以使用相同的show()方法来展示它们。你能理解,为什么这种统一的接口设计让代码更加简洁和灵活吗?

步骤2:定义叶子节点类(文件)
class File(FileSystemComponent):def __init__(self, name: str):self.name = namedef show(self):print(f"File: {self.name}")

问题6:File类是如何实现抽象组件类的?它是如何表示一个叶子节点(文件)的?

File类实现了FileSystemComponent接口,并提供了具体的show()方法来展示文件的名称。你是否理解,叶子节点对象是如何完成具体操作的,而不需要包含子节点?

步骤3:定义容器节点类(文件夹)

问题7:Folder类是如何作为容器节点来管理子节点的?它如何处理包含子节点的情况?

Folder类继承自FileSystemComponent并实现了show()方法。它还定义了add()方法来添加子节点(文件或文件夹)。你是否理解,容器节点(文件夹)通过管理子节点来扩展功能?它如何将对所有子节点的操作统一起来?

步骤4:客户端代码
def main():# 创建文件和文件夹file1 = File("file1.txt")file2 = File("file2.txt")folder1 = Folder("folder1")# 将文件添加到文件夹中folder1.add(file1)folder1.add(file2)# 创建另一个文件夹folder2 = Folder("folder2")file3 = File("file3.txt")folder2.add(file3)# 将文件夹添加到主文件夹中folder1.add(folder2)# 显示文件夹和文件的层次结构folder1.show()if __name__ == "__main__":main()

问题8:在客户端代码中,如何通过组合模式来管理文件和文件夹的层次结构?你能理解,为什么通过容器节点(文件夹)来管理文件和其他文件夹让代码更加简洁?

客户端通过Folder类将文件和文件夹添加到层次结构中,并通过show()方法统一展示文件系统。你是否理解,为什么组合模式通过这种方式让树形结构的操作变得更加灵活?

组合模式的优缺点

问题9:组合模式的优点是什么?它如何帮助我们简化树形结构的操作?

组合模式的一个主要优点是它提供了统一的接口,允许我们以相同的方式操作叶子节点和容器节点。你能理解,为什么这种方式让树形结构的处理变得更加简单和灵活吗?

问题10:组合模式的缺点是什么?它是否会导致某些操作过于通用,缺乏具体性?

尽管组合模式简化了树形结构的管理,但它也可能带来一些问题。例如,如果一个叶子节点和容器节点的操作差异较大,组合模式可能会导致某些操作变得过于通用。你是否认为,这会让系统的灵活性和表达能力受到影响?

适用场景

问题11:组合模式适用于哪些场景?

组合模式适用于以下场景:

  • 需要处理树形结构的对象时,如文件夹和文件、公司和员工。

  • 需要统一管理树形结构中的各个节点,允许对叶子节点和容器节点进行相同的操作时。

  • 当系统需要支持动态变化的树形结构时,组合模式能够使得系统更加灵活。

你能想到其他类似的场景吗?例如,GUI界面组件的层次结构、组织结构图等,是否也可以使用组合模式?

问题12:组合模式是否适用于所有场景?是否有些场景不需要这么复杂的树形结构?

虽然组合模式在处理树形结构时非常有用,但在一些场景中,如果结构非常简单,是否可以不使用组合模式,而选择更简单的设计方法?你是否认为,组合模式对于非常简单的对象结构来说可能会引入不必要的复杂性?

接下来,我们将通过具体的代码示例来加深理解组合模式。

组合模式深入解读

一、引言

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式让客户端可以一致地处理单个对象和对象集合。它常用于需要表示树形结构的场景,例如文件系统、组织结构等。


二、简单理解:什么是组合模式?

1. 什么是组合模式?

组合模式的核心思想是:你可以将对象和对象集合组合成一个整体对象,使得你可以像对待单个对象一样对待对象集合。组合模式通过将对象和它们的集合组织成树形结构,使得单个对象和组合对象的操作一致,从而简化了客户端代码。

通俗地讲,组合模式就像是你有一个文件夹,文件夹里可以存放文件,也可以存放其他文件夹。你可以在一个文件夹中存放文件和子文件夹,而不需要关心文件和文件夹的差异。你对文件夹的操作就可以同时影响其中的所有文件和文件夹。

2. 组合模式的组成部分

组合模式通常包含以下几个部分:

  • 组件接口(Component):定义了叶子节点和容器节点的共同接口。

  • 叶子节点(Leaf):表示树形结构中的终端对象,通常没有子节点。

  • 容器节点(Composite):表示树形结构中的非终端对象,可以包含子节点(其他容器节点或叶子节点)。

  • 客户端(Client):通过组件接口与叶子节点和容器节点交互,不需要关心它们的具体实现。


三、用自己的话解释:如何理解组合模式?

1. 类比实际生活中的场景

想象一下,你有一个组织结构图,公司的顶层是总经理,下面有不同的部门经理,每个部门经理下面又有不同的员工。你可以通过组合模式来表示这个结构:每个经理和员工是叶子节点,部门经理和总经理是容器节点。你可以对整个组织(即容器节点)执行一些操作,而不需要区分它是部门经理还是员工。每个节点都实现了相同的接口,客户端可以统一处理这些节点。

2. 为什么要使用组合模式?

组合模式的主要优势在于,它简化了对象的处理。当你有复杂的层次结构时,客户端不需要关心是操作单个对象,还是操作包含多个对象的容器。客户端通过一致的接口就可以统一处理单个对象和容器对象,降低了系统的复杂度。


四、深入理解:组合模式的实现

接下来,我们通过一个具体的代码示例来实现组合模式,帮助你更好地理解如何在代码中使用这个模式。

示例:文件系统

假设我们需要设计一个文件系统,文件夹和文件是两种不同的对象,文件夹可以包含文件或其他文件夹。我们将使用组合模式来表示文件夹和文件的结构。

1. 定义组件接口:文件系统组件
# 组件接口:定义文件和文件夹的共同行为
class FileSystemComponent:def show(self):pass
2. 定义叶子节点:文件类
# 叶子节点类:文件
class File(FileSystemComponent):def __init__(self, name: str):self.name = namedef show(self):print(f"File: {self.name}")
3. 定义容器节点:文件夹类
# 容器节点类:文件夹
class Folder(FileSystemComponent):def __init__(self, name: str):self.name = nameself.children = []def add(self, component: FileSystemComponent):self.children.append(component)def remove(self, component: FileSystemComponent):self.children.remove(component)def show(self):print(f"Folder: {self.name}")for child in self.children:child.show()  # 递归显示子元素
4. 客户端代码:使用文件夹和文件
# 创建文件和文件夹
file1 = File("File1.txt")
file2 = File("File2.txt")folder1 = Folder("Folder1")
folder2 = Folder("Folder2")# 创建子文件夹并添加文件
folder2.add(file1)
folder2.add(file2)# 在父文件夹中添加子文件夹
folder1.add(folder2)# 显示整个文件结构
folder1.show()
代码解析:
  1. FileSystemComponent 类:这是组件接口,定义了所有文件系统元素的公共方法(如 show 方法)。文件和文件夹都实现了这个接口。

  2. File 类:这是叶子节点,表示文件。它实现了 show 方法,输出文件的名称。

  3. Folder 类:这是容器节点,表示文件夹。它可以包含其他文件或文件夹,通过递归的方式展示其所有子节点。

  4. 客户端代码:我们创建了文件和文件夹,并将文件夹作为容器节点,文件作为叶子节点。通过调用 show 方法,客户端可以统一显示文件系统中的所有内容。


五、解释给别人:如何讲解组合模式?

1. 用简单的语言解释

组合模式就像是你有一个文件夹,文件夹里可以存放文件,也可以存放其他文件夹。你可以通过同一个操作(如显示文件)来处理单个文件和包含多个文件的文件夹,而不需要关心它们的具体区别。每个文件夹和文件都实现了相同的接口,因此你可以像操作文件一样操作文件夹,简化了复杂结构的处理。

2. 为什么要使用组合模式?

使用组合模式的好处是,你可以统一处理单个对象和对象集合。在面对复杂的层次结构时,组合模式让你可以不需要关心具体实现,直接通过统一的接口进行操作。这样,你的代码就更简单、更灵活,易于扩展和维护。


六、总结

通过一系列问题的引导,我们逐步理解了组合模式的核心思想、实现方式以及它的优缺点。组合模式通过将对象组织成树形结构,使得每个节点(无论是叶子节点还是容器节点)都能用相同的方式进行处理,从而使得复杂结构的管理和操作变得更加灵活和简洁。

然而,组合模式也有其局限,特别是在节点的行为差异较大时,可能导致操作过于通用,缺乏足够的灵活性。因此,在实际开发中,我们需要根据具体需求来评估是否采用组合模式。

通过以上学习过程,我们可以得出以下结论:

  • 组合模式 允许你将单个对象和对象集合组合成一个统一的结构,并通过统一的接口处理这些对象。它适用于需要表示树形结构的场景,如文件系统、公司组织结构等。

  • 组合模式的关键在于通过递归的方式将不同层级的对象组织起来,使得客户端代码能够一致地处理这些对象。

  • 组合模式使得客户端代码不需要关注层次结构的复杂性,而是通过统一的接口来进行操作,简化了系统的管理和扩展。

组合模式的优点:
  • 简化代码:客户端可以通过统一的接口处理单个对象和对象集合,降低了代码复杂性。

  • 易于扩展:可以轻松地增加新的叶子节点或容器节点,而不需要修改客户端代码。

  • 灵活性:能够处理任意深度的树形结构,适合于表示复杂的层次结构。

组合模式的缺点:
  • 性能问题:对于深度较大的树形结构,递归调用可能导致性能问题。

  • 复杂性增加:引入容器节点和叶子节点的分离,可能使得系统的设计变得更加复杂,尤其是在节点数量非常多时。

相关文章:

13.组合模式:思考与解读

原文地址:组合模式:思考与解读 更多内容请关注:7.深入思考与解读设计模式 引言 在软件开发中,是否曾经遇到过这样一种情况:你有一个对象,它本身很简单,但是它包含了其他类似的对象。随着系统变得越来越复…...

Pycharm(十七)生成器

一、生成器介绍 1.1 概述 生成器指的是Generator对象,它不再像以往一样,一次性生成所有的数据,而是用一个,再生成一个,基于用户写的规则(条件)来生成数据,如果条件不成立&#xff…...

盛元广通实验材料管理系统-实验室管理系统-LIMS

一、引言 在当下科学研究及各类实验日益频繁的背景下,实验材料管理成为实验室高效运作的核心环节。从“人工低效”到“智能自动化”,盛元广通可覆盖实验材料的采购、存储、使用、追踪等全流程,从功能适配性、技术性能、成本效益、供应商服务…...

检查 NetCDF Fortran的版本

执行 nf-config --all命令后,它会输出一堆信息,大致像这样: This netCDF-Fortran version: 4.6.0 netCDF-Fortran installation dir: /usr/local/netcdf4 Fortran compiler: gfortran Fortran compiler flags: -g -O2 Fortran preprocesso…...

MySQL 存储引擎与服务体系深度解析

一、存储引擎核心概念 基本定义 存储引擎:MySQL服务的核心组件,负责数据的存储、检索和管理版本演进: MySQL 5.0/5.1 默认使用MyISAM引擎MySQL 5.5/5.6+ 默认采用InnoDB引擎关键特性 不同存储引擎采用不同的数据存储结构和处理机制直接影响表的CRUD操作性能和数据安全特性作…...

乐企数电发票分布式发票号码生成重复的问题修复思路分享

文章目录 1.前言2.解决思路2.1错误姿势2.2歪打正着2.3正确姿势 3.总结 1.前言 由于之前接了乐企数电开票,服务上线之后,使用的公司少没有啥问题,后面切换了两家日开票量大的公司上线之后,就发现发票号码生成重复了,后面…...

多级缓存架构设计与实践经验

多级缓存架构设计与实践经验 在互联网大厂Java求职者的面试中,经常会被问到关于多级缓存的架构设计和实践经验。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官:马架构,欢迎来到我们公司的面试现场。请问您对多级…...

LCD1602液晶显示屏详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图​编辑 2.接口说明 三、程序设计 main文件 lcd1602.h文件 lcd1602.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 LCD1602A字符型液晶显示模块是专门用于显示字母、数字元、符号等的点阵型液晶显示模块。分4位和8位数据…...

Golang | 集合求交

文章目录 bitmap求交集2个有序链表多个有序链表跳表 bitmap求交集 2个有序链表 多个有序链表 为什么非最大的所有都要往后移动呢?因为现在已经知道交集即使有,也最小都是这个目前最大的了,其他不是最大的不可能是交集,所有除了最大…...

手机充电进入“秒充“时代:泡面刚下锅,电量已满格

现代人的生活节奏越来越快,手机充电技术也在飞速发展。从最初的"充电一整晚"到如今的"秒充"时代,充电效率的提升正在悄然改变着我们的生活习惯。最新数据显示,目前最快的手机充电技术仅需4分30秒就能充满一部手机的电量&…...

网站字体文件过大 导致字体从默认变成指定字体的时间过长

1.选择字体中只用到的字符集较小的包 只用到了数字,所以使用了 xx-sans.ttf的版本(86kb) 2.转换ttf格式为woff2 转换后26kb 3.使用字体 // 定义字体 font-face {font-family: "myFont";src: url(/assets/fonts/myFont.woff2) format(woff2);font-weigh…...

WPF常用技巧汇总 - Part 2

WPF常用技巧汇总-CSDN博客 主要用于记录工作中发现的一些问题和常见的解决方法。 目录 WPF常用技巧汇总-CSDN博客 1. DataGrid Tooltip - Multiple 2. DataGrid Tooltip - Cell值和ToolTip值一样 3. DataGrid Tooltip - Cell值和ToolTip值不一样 4. DataGrid - Ctrl A /…...

C++中析构函数

析构函数 析构函数(Destructor)是类的一种特殊成员函数,用于在对象的生命周期结束时执行清理操作,他的主要作用是释放对象占用资源,例如动态分配的内存,文件句柄或网络连接等。 特点 名称与类名称相同 单…...

树莓派超全系列教程文档--(44)如何在树莓派上编译树莓派内核

如何在树莓派上编译树莓派内核 构建内核下载内核源代码 本地构建内核构建配置使用 LOCALVERSION 自定义内核版本构建安装内核 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 构建内核 操作系统预装的默认编译器和链接器被配置为构建在该操作系统…...

flask返回文件的同时返回其他参数

参考:flask实现上传文件与下载文件_flask 文件上传和下载-CSDN博客 在 Flask 中,返回文件的同时附加额外参数(如处理时间)可以通过 自定义 HTTP 响应头 或 返回 JSON 数据与文件结合 的方式实现。以下是具体方法和示例: 方法 1:通过 HTTP 响应头 附加参数(推荐) 将参…...

C++23 std::move_only_function:一种仅可移动的可调用包装器 (P0288R9)

文章目录 一、定义与基本概念1.1 定义1.2 基本概念 二、特点2.1 仅可移动性2.2 支持多种限定符2.3 无target_type和target访问器2.4 强前置条件 三、使用场景3.1 处理不可复制的可调用对象3.2 性能优化3.3 资源管理 四、与其他可调用包装器的对比4.1 与std::function的对比4.2 …...

Zookeeper实现分布式锁实战应用

Zookeeper实现分布式锁实战应用示例 1. 分布式锁概述 在分布式系统中,当多个进程或服务需要互斥地访问共享资源时,就需要分布式锁来协调。Zookeeper因其强一致性和临时节点特性,非常适合实现分布式锁。 2. Zookeeper实现分布式锁的核心原理…...

使用 Playwright 构建高效爬虫:原理、实战与最佳实践

随着网站前端技术日益复杂,传统的基于请求解析(如 requests、BeautifulSoup)的爬虫在处理 JavaScript 渲染的网站时变得力不从心。Playwright,作为微软推出的一款强大的自动化浏览器控制框架,不仅适用于自动化测试,也成为了处理现代网站爬取任务的利器。 本篇文章将带你…...

ComfyUI for Windwos与 Stable Diffusion WebUI 模型共享修复

#工作记录 虽然在安装ComfyUI for Windwos时已经配置过extra_model_paths.yaml 文件,但升级ComfyUI for Windwos到最新版本后发现原先的模型配置失效了,排查后发现,原来是 extra_model_paths.yaml 文件在新版本中被移动到了C盘目录下&#x…...

【RabbitMQ消息队列】详解(一)

初识RabbitMQ RabbitMQ 是一个开源的消息代理软件,也被称为消息队列中间件,它遵循 AMQP(高级消息队列协议),并且支持多种其他消息协议。 核心概念 生产者(Producer):创建消息并将其…...

【MySQL数据库入门到精通-08 约束】

文章目录 4、约束4.1 概述4.2 约束演示1. 根据需求,完成表的创建2. SQL数据库3. 结果 4.3 外键约束4.3.1 介绍1. 根据需求,完成表的创建2. SQL数据库3. 结果4.3.2 外键约束建立1. 语法2. SQL语句3. 现象4.3.3 外键删除更新行为1. 知识点2.SQL3.结果 4、约…...

C++笔记-模板进阶和继承(上)

一.模板进阶 1.1非模板类型参数 那之前学过的stack举例,在这之前我们如果要用N,就要用宏来定义,但是宏毕竟有局限性: 如果我要用到两个stack,一个要求10个空间,另一个要求100空间呢? 这时候…...

云计算赋能质检LIMS的价值 质检LIMS系统在云计算企业的创新应用

在云计算技术高速发展的背景下,实验室信息化管理正经历深刻变革。质检LIMS(实验室信息管理系统)作为实验室数字化转型的核心工具,通过与云计算深度融合,为企业提供了高弹性、高安全性的解决方案。本文将探讨质检LIMS在…...

2025系统架构师---数据抽象(Data Abstraction)‌与‌面向对象架构风格

引言 在软件系统复杂度与规模不断攀升的今天,如何设计出可扩展、易维护且能快速响应需求变化的架构,是每一位系统架构师面临的挑战。‌数据抽象(Data Abstraction)‌与‌面向对象架构风格(Object-Oriented Architectu…...

[python] 基于WatchDog库实现文件系统监控

Watchdog库是Python中一个用于监控文件系统变化的第三方库。它能够实时监测文件或目录的创建、修改、删除等操作,并在这些事件发生时触发相应的处理逻辑,因此也被称为文件看门狗。 Watchdog库的官方仓库见:watchdog,Watchdog库的官…...

缺省处理、容错处理

布尔判定 假:false 0 null undefined NaN 可选符.?和?? let obj {name: jim,data: {money: 0,age: 18,fn(a){return a}} }1、如果左侧的值为null或者undefined,则使用右侧值。需要使用"??" obj?.data?.a…...

Taro on Harmony :助力业务高效开发纯血鸿蒙应用

背景 纯血鸿蒙逐渐成为全球第三大操作系统,业界也掀起了适配鸿蒙原生的浪潮,用户迁移趋势明显,京东作为国民应用,为鸿蒙用户提供完整的购物体验至关重要。   去年 9 月,京东 AP…...

Java基础——排序算法

排序算法不管是考试、面试、还是日常开发中都是一个特别高频的点。下面对八种排序算法做简单的介绍。 1. 冒泡排序(Bubble Sort) 原理:相邻元素比较,每一轮将最大元素“冒泡”到末尾。 示例数组:[5, 3, 8, 1, 2] pub…...

【操作系统原理07】输入/输出系统

文章目录 零.大纲一.I/O设备的概念和分类0.大纲1.什么是I/O设备2.I/O分类 二.I/O控制器0.大纲1.I/O设备的电子部件(I/O控制器)2.IO控制器组成3.内存映像I/O VS 寄存器独立编址 三.I/O控制方式0.大纲与总结1.程序直接控制方式(1) 操…...

IM云端搜索全面升级,独家能力拓展更多“社交连接”玩法

在这个数字时代,网络让信息传递前所未有的便捷,但同时,海量数据堆积也让内容检索变得像大海捞针。尤其是在我们日常工作生活中最常用的即时通信软件中,信息的快速查找和精准定位正变得越来越重要。 但传统的本地搜索功能受限于设…...

汽车产业链主表及类别表设计

(提前设计,备用) 一、汽车产业链类别表(industry_chain_category) 设计要点 1、核心字段:定义产业链分类(如零部件、整车制造、销售服务等) 2、主键约束:自增ID作为唯一标…...

有效的字母异位词

recorded&#xff1a;用于统计或抵消字符出现次数。 class Solution { public:bool isAnagram(string s, string t) {int record[26]{0};for(int i0;i<s.size();i){record[s[i]-a];}for(int i0;i<t.size();i){record[t[i]-a]--;}for(int i0;i<26;i){if(record[i]!0){…...

汽车网络安全 -- 理解暴露面、攻击面和攻击向量

1.暴露面是攻击面的子集 举个例子&#xff0c;房子都有门、窗户&#xff0c;这些窗户、门不管是否打开&#xff0c;都可能被小偷利用进入到房内&#xff0c;因此这些门窗可能是潜在的漏洞&#xff0c;所以称之为攻击面(Attack Surface)。 小偷经过长期观察&#xff0c;发现家…...

C++异步利器:全面理解 std::packaged_task

在现代 C&#xff08;C11及以后&#xff09;中&#xff0c;并发与异步编程是不可回避的重要技能。我们常常希望把某些计算任务扔给后台线程去处理&#xff0c;同时又能优雅地获取任务结果。 这时候&#xff0c;std::packaged_task 就是一个非常强大的工具。 本文将带你深入理解…...

Animate 中HTMLCanvas 画布下的鼠标事件列表(DOM 鼠标)

在 JavaScript 和 ‌Adobe Animate&#xff08;CreateJS&#xff09;‌ 中&#xff0c;常用的鼠标交互事件可分为两大类&#xff1a;‌基础 DOM 事件‌ 和 ‌CreateJS 扩展事件‌12。以下是完整分类&#xff1a; 一、基础 DOM 鼠标事件 事件名触发场景冒泡特性click鼠标左键单…...

RagFlow文档切块提升

1.RagFlow切块介绍 2.复现优化 2.1 General 通用分块 def parser_text(self, txt, blockSize512, overlapSize0, delimiter"\n!?;。&#xff1b;&#xff01;&#xff1f;"):文本分割sentences self.split_text_by_period_qh(txt, delimiter, blockSizeblockSize)…...

音频转base64

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>音频转Base64</title><style>.containe…...

蓝桥杯 11. 打印大X

打印大X 原题目链接 题目描述 小明希望用星号拼凑&#xff0c;打印出一个大 X&#xff0c;他要求能够控制笔画的宽度和整个字的高度。 为了便于比对空格&#xff0c;所有的空白位置都以句点符 . 来代替。 输入描述 输入两个整数 m 和 n&#xff0c;表示笔画的宽度和 X 的高…...

页面需要重加载才能显示的问题修改

1.问题描述&#xff1a;跳转页面后&#xff0c;只有点击重新加载后才会显示内容 经过测试后&#xff1a; / 跳转详情 const goToDetail (bookId) > { router.push({ path: /classic-detail, query: { book_id: bookId } }) } 执行完以上代码后&#xff0c;页面从classics…...

On the Biology of a Large Language Model——Claude团队的模型理解文章【论文阅读笔记】其二——数学计算部分

这篇内容的源博文是 On the Biology of a Large Language Model 这是Anthropic&#xff0c;也就是Claude的团队的一遍技术博客。他的主要内容是用一种改良版的稀疏编码器来解释LLM在inference过程中内部语义特征的激活模式。因为原文太长&#xff0c;我把原文分成了几份来写阅读…...

Python语言基础知识详解:标识符与变量

Python语言基础知识详解&#xff1a;标识符与变量 一、标识符&#xff08;Identifiers&#xff09; 定义 标识符是用于命名变量、函数、类、模块或其他对象的名称。它是代码中对实体的唯一标识。 1. 标识符的命名规则 Python的标识符需遵循以下规则&#xff1a; 允许的字符 由…...

google chrome 中 fcitx5 候选框不跟随光标

我的电脑&#xff1a;ubuntu22.04&#xff0c;窗口系统&#xff1a;wayland 2025/4/26 号更新的谷歌浏览器 今天打开浏览器发现输入法的候选框固定在左上角不动了&#xff0c;一番折腾&#xff0c;发现解决办法如下&#xff1a; 在搜索框中输入 about:flags搜索 wayland&#…...

深入浅出提示词工程(结合 DeepSeek)

提示词工程 Prompt 即提示、指令&#xff0c;所以提示工程也叫「指令工程」 用户输入的问题称为 Prompt&#xff0c;本文主要探讨 System Prompt&#xff08;我将其翻译成「系统预设」&#xff09; 使用 Prompt 的目的 直接提问 如「我该学 Vue 还是 React&#xff1f;」&…...

OpenVLA:大语言模型用于机器人操控的经典开源作品

TL;DR 2024 年斯坦福大学提出的 OpenVLA&#xff0c;基于大语言模型实现机器人操控&#xff0c;代码完全开源。 Paper Notes Name&#xff1a;OpenVLA: An Open-Source Vision-Language-Action ModelURL&#xff1a;https://openvla.github.io/作者&#xff1a;斯坦福&#…...

数值分析、数值代数之追赶法

数值分析、数值代数之追赶法 MATLAB 中&#xff0c;diag 函数用法追赶法推导过程代码运行过程 MATLAB 中&#xff0c;diag 函数用法 在 MATLAB 中&#xff0c;diag 函数用于处理矩阵的对角线元素或创建对角矩阵。以下是其常见的用法&#xff1a; 1.提取矩阵的对角线元素 2.创…...

深入浅出JVM - Java架构师面试实战

深入浅出JVM - Java架构师面试实战 本文通过模拟一位拥有十年Java研发经验的资深架构师马架构与面试官之间的对话&#xff0c;深入探讨了JVM的核心知识点。涵盖内存结构、垃圾回收算法、垃圾回收器、内存调优工具及参数配置等关键领域。 第一轮提问 面试官&#xff1a; 马架…...

Qt网络数据解析方法总结

在Qt中解析网络数据通常涉及接收原始字节流&#xff0c;并将其转换为有意义的应用层数据。以下是详细步骤和示例&#xff1a; 1. 网络数据接收 使用QTcpSocket或QUdpSocket接收数据&#xff0c;通过readyRead()信号触发读取&#xff1a; // 创建TCP Socket并连接信号 QTcpSo…...

[AHOI2001] 质数和分解

import java.util.*;public class Main {static int[] ss new int[201];public static void main(String[] args) {Scanner sc new Scanner(System.in);while (sc.hasNextInt()) { int n sc.nextInt();int num 0; // 记录质数个数int[] dp new int[201];dp[0] 1;for (in…...

说一下Drop与delete区别

在数据库操作里&#xff0c;DROP与DELETE是两个重要且功能不同的命令&#xff0c;以下为你详细介绍二者的区别&#xff1a; 功能层面 DROP&#xff1a;此命令用于删除数据库、表、视图、索引等数据库对象。一旦执行&#xff0c;数据库对象就会被彻底删除&#xff0c;其定义和…...

基于云原生架构的后端微服务治理实战指南

一、引言&#xff1a;为什么在云原生时代更需要微服务治理&#xff1f; 在单体应用时代&#xff0c;开发和部署虽然简单&#xff0c;但随着系统规模的扩大&#xff0c;单体架构的维护成本急剧上升&#xff0c;部署频率受限&#xff0c;模块之间相互影响&#xff0c;最终导致系…...