组合模式(Composite Pattern)详解
文章目录
- 1. 什么是组合模式?
- 2. 为什么需要组合模式?
- 3. 组合模式的核心概念
- 4. 组合模式的结构
- 5. 组合模式的基本实现
- 5.1 基础示例:文件系统
- 5.2 透明组合模式 vs 安全组合模式
- 5.2.1 透明组合模式
- 5.2.2 安全组合模式
- 5.3 实例:公司组织结构
- 5.4 实例:GUI组件树
- 6. Java中组合模式的实际应用
- 6.1 Java AWT和Swing
- 6.2 Java集合框架
- 6.3 XML/HTML DOM结构
- 7. 组合模式与其他设计模式的比较
- 7.1 组合模式 vs 装饰器模式
- 7.2 组合模式 vs 迭代器模式
- 7.3 组合模式 vs 责任链模式
- 8. 组合模式的优缺点
- 8.1 优点
- 8.2 缺点
- 9. 何时使用组合模式?
- 10. 常见问题与解决方案
- 10.1 如何处理组件树中的遍历?
- 10.2 如何在组合模式中实现多种操作?
- 10.3 如何确保组件树的类型安全?
- 11. 总结
- 12. 实际应用场景示例
- 12.1 菜单系统
- 12.2 文件压缩系统
- 12.3 企业员工管理系统
- 13. 组合模式在实际项目中的应用
- 13.1 Spring Security的权限管理
- 13.2 Elasticsearch的查询构建
- 13.3 前端框架中的组件系统
- 13.4 游戏开发中的场景图
- 14. 组合模式的变种和扩展
- 14.1 组合模式与命令模式结合
- 14.2 组合模式与责任链模式结合
- 14.3 带缓存的组合模式
- 15. 总结与最佳实践
- 15.1 何时使用组合模式
- 15.2 实现组合模式的最佳实践
- 15.3 常见陷阱
1. 什么是组合模式?
组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示"部分-整体"的层次结构。组合模式使得客户端可以统一对待单个对象和组合对象,无需区分它们之间的差异。
在软件开发中,我们经常会遇到处理树形结构(如文件系统、组织结构、菜单系统等)的情况,组合模式正是为了解决这类问题而设计的。
2. 为什么需要组合模式?
在以下情况下,组合模式特别有用:
- 当需要表示对象的部分-整体层次结构时:例如,树形结构中的节点可以包含子节点,这些子节点又可以包含其他子节点
- 当希望客户端忽略单个对象和组合对象的差异时:客户端代码可以统一处理所有对象,而不需要编写不同的代码来处理不同类型的对象
- 当系统需要与树形结构交互,同时保持结构的灵活性时:可以动态地添加或删除组件
3. 组合模式的核心概念
组合模式的核心是创建一个能够表示层次结构的类层次结构:
- 组件(Component):为所有对象(包括组合对象和叶节点对象)定义共同的接口,可以是抽象类或接口
- 叶节点(Leaf):表示层次结构中的基本对象,没有子节点
- 组合节点(Composite):包含子节点的对象,提供管理子节点的方法
这种结构允许我们创建一个树形结构,其中每个节点都可以是单个对象(叶节点)或包含其他节点的组合对象。
4. 组合模式的结构
组合模式通常包含以下角色:
- 抽象组件(Component):声明组合中所有对象的共同接口,定义了对所有组件都通用的默认行为,包括访问和管理子组件的方法
- 叶子组件(Leaf):表示组合中的叶子节点对象,没有子节点,实现了Component接口
- 组合组件(Composite):表示组合中的复杂组件,包含子组件,实现了Component接口,并提供了管理子组件的方法
- 客户端(Client):通过Component接口操作组合部件对象
5. 组合模式的基本实现
5.1 基础示例:文件系统
考虑一个文件系统,它包含文件和目录,目录可以包含文件和其他目录。我们可以使用组合模式来表示这种结构。
首先,定义组件接口:
// 文件系统组件接口
public interface FileSystemComponent {void printName();void printDetails();long getSize();String getName();
}
然后,实现叶子节点(文件):
// 文件类(叶节点)
public class File implements FileSystemComponent {private String name;private long size;public File(String name, long size) {this.name = name;this.size = size;}@Overridepublic void printName() {System.out.println(name);}@Overridepublic void printDetails() {System.out.println("文件: " + name + ", 大小: " + size + " KB");}@Overridepublic long getSize() {return size;}@Overridepublic String getName() {return name;}
}
接着,实现组合节点(目录):
import java.util.ArrayList;
import java.util.List;// 目录类(组合节点)
public class Directory implements FileSystemComponent {private String name;private List<FileSystemComponent> components = new ArrayList<>();public Directory(String name) {this.name = name;}// 添加组件到目录public void addComponent(FileSystemComponent component) {components.add(component);}// 从目录移除组件public void removeComponent(FileSystemComponent component) {components.remove(component);}@Overridepublic void printName() {System.out.println(name);}@Overridepublic void printDetails() {System.out.println("目录: " + name + ", 包含 " + components.size() + " 个项目, 总大小: " + getSize() + " KB");System.out.println("目录 '" + name + "' 内容:");for (FileSystemComponent component : components) {System.out.print(" "); // 添加缩进component.printDetails();}}@Overridepublic long getSize() {long totalSize = 0;for (FileSystemComponent component : components) {totalSize += component.getSize();}return totalSize;}@Overridepublic String getName() {return name;}
}
最后,客户端代码示例:
public class FileSystemDemo {public static void main(String[] args) {// 创建文件FileSystemComponent file1 = new File("document.txt", 100);FileSystemComponent file2 = new File("image.jpg", 2000);FileSystemComponent file3 = new File("spreadsheet.xlsx", 500);// 创建子目录Directory documentsDir = new Directory("Documents");documentsDir.addComponent(file1);documentsDir.addComponent(file3);Directory picturesDir = new Directory("Pictures");picturesDir.addComponent(file2);// 创建根目录Directory rootDir = new Directory("Root");rootDir.addComponent(documentsDir);rootDir.addComponent(picturesDir);// 打印整个文件系统rootDir.printDetails();// 打印特定目录System.out.println("\n特定目录详情:");documentsDir.printDetails();}
}
输出结果:
目录: Root, 包含 2 个项目, 总大小: 2600 KB
目录 'Root' 内容:目录: Documents, 包含 2 个项目, 总大小: 600 KB目录 'Documents' 内容:文件: document.txt, 大小: 100 KB文件: spreadsheet.xlsx, 大小: 500 KB目录: Pictures, 包含 1 个项目, 总大小: 2000 KB目录 'Pictures' 内容:文件: image.jpg, 大小: 2000 KB特定目录详情:
目录: Documents, 包含 2 个项目, 总大小: 600 KB
目录 'Documents' 内容:文件: document.txt, 大小: 100 KB文件: spreadsheet.xlsx, 大小: 500 KB
在这个例子中:
- 组件(Component):
FileSystemComponent
接口定义了文件和目录共有的方法 - 叶节点(Leaf):
File
类表示文件,没有子节点 - 组合节点(Composite):
Directory
类表示目录,可以包含文件和其他目录
客户端通过统一的接口与文件和目录交互,无需区分它们的具体类型。
5.2 透明组合模式 vs 安全组合模式
组合模式有两种常见的实现方式:
5.2.1 透明组合模式
在透明组合模式中,Component接口中声明了所有用于管理子对象的方法,如add()、remove()等。这样,叶子节点和组合节点都具有相同的接口,客户端可以一致地处理它们。
// 透明组合模式的组件接口
public interface TransparentComponent {void operation(); // 业务方法void add(TransparentComponent component); // 添加子节点void remove(TransparentComponent component); // 移除子节点TransparentComponent getChild(int index); // 获取子节点
}// 透明组合模式的叶节点
public class TransparentLeaf implements TransparentComponent {private String name;public TransparentLeaf(String name) {this.name = name;}@Overridepublic void operation() {System.out.println("叶节点 " + name + " 的操作");}@Overridepublic void add(TransparentComponent component) {// 叶节点不支持添加子节点,抛出异常或忽略throw new UnsupportedOperationException("叶节点不能添加子节点");}@Overridepublic void remove(TransparentComponent component) {// 叶节点不支持移除子节点,抛出异常或忽略throw new UnsupportedOperationException("叶节点不能移除子节点");}@Overridepublic TransparentComponent getChild(int index) {// 叶节点没有子节点,抛出异常或返回nullthrow new UnsupportedOperationException("叶节点没有子节点");}
}// 透明组合模式的组合节点
public class TransparentComposite implements TransparentComponent {private String name;private List<TransparentComponent> children = new ArrayList<>();public TransparentComposite(String name) {this.name = name;}@Overridepublic void operation() {System.out.println("组合节点 " + name + " 的操作");// 调用所有子节点的操作for (TransparentComponent child : children) {child.operation();}}@Overridepublic void add(TransparentComponent component) {children.add(component);}@Overridepublic void remove(TransparentComponent component) {children.remove(component);}@Overridepublic TransparentComponent getChild(int index) {return children.get(index);}
}
优点:客户端可以统一处理组合对象和叶子对象,无需区分。
缺点:叶子节点必须实现一些对它们无意义的方法,破坏了类型安全。
5.2.2 安全组合模式
在安全组合模式中,Component接口只声明所有类共有的行为,而组合对象特有的方法(如add()、remove()等)则只在Composite类中声明。
// 安全组合模式的组件接口
public interface SafeComponent {void operation(); // 只包含共有的业务方法
}// 安全组合模式的叶节点
public class SafeLeaf implements SafeComponent {private String name;public SafeLeaf(String name) {this.name = name;}@Overridepublic void operation() {System.out.println("叶节点 " + name + " 的操作");}
}// 安全组合模式的组合节点
public class SafeComposite implements SafeComponent {private String name;private List<SafeComponent> children = new ArrayList<>();public SafeComposite(String name) {this.name = name;}@Overridepublic void operation() {System.out.println("组合节点 " + name + " 的操作");// 调用所有子节点的操作for (SafeComponent child : children) {child.operation();}}// 以下方法不在接口中声明,只在组合类中定义public void add(SafeComponent component) {children.add(component);}public void remove(SafeComponent component) {children.remove(component);}public SafeComponent getChild(int index) {return children.get(index);}
}
优点:叶子节点不需要实现无意义的方法,保持了类型安全。
缺点:客户端需要区分处理组合对象和叶子对象,因为只有组合对象才有添加和删除子节点的方法。
5.3 实例:公司组织结构
下面是一个表示公司组织结构的组合模式示例。一个公司有多个部门,每个部门有多个员工。我们可以使用组合模式来表示这种结构。
// 组织组件接口
public interface OrganizationComponent {void display();void duty();void add(OrganizationComponent component);void remove(OrganizationComponent component);OrganizationComponent getChild(int index);
}// 组织组件抽象类,提供一些默认实现
public abstract class Organization implements OrganizationComponent {private String name;public Organization(String name) {this.name = name;}public String getName() {return name;}// 默认实现,子类可以根据需要覆盖@Overridepublic void add(OrganizationComponent component) {throw new UnsupportedOperationException();}@Overridepublic void remove(OrganizationComponent component) {throw new UnsupportedOperationException();}@Overridepublic OrganizationComponent getChild(int index) {throw new UnsupportedOperationException();}
}// 员工类(叶节点)
public class Employee extends Organization {private String position;public Employee(String name, String position) {super(name);this.position = position;}@Overridepublic void display() {System.out.println("员工:" + getName() + ",职位:" + position);}@Overridepublic void duty() {System.out.println("员工 " + getName() + " 的职责是完成分配的工作");}
}// 部门类(组合节点)
public class Department extends Organization {private List<OrganizationComponent> subordinates = new ArrayList<>();public Department(String name) {super(name);}@Overridepublic void add(OrganizationComponent component) {subordinates.add(component);}@Overridepublic void remove(OrganizationComponent component) {subordinates.remove(component);}@Overridepublic OrganizationComponent getChild(int index) {return subordinates.get(index);}@Overridepublic
相关文章:
组合模式(Composite Pattern)详解
文章目录 1. 什么是组合模式?2. 为什么需要组合模式?3. 组合模式的核心概念4. 组合模式的结构5. 组合模式的基本实现5.1 基础示例:文件系统5.2 透明组合模式 vs 安全组合模式5.2.1 透明组合模式5.2.2 安全组合模式5.3 实例:公司组织结构5.4 实例:GUI组件树6. Java中组合模…...
最长字符串 / STL+BFS
题目 代码 #include <bits/stdc.h> using namespace std;int main() {map<vector<int>, vector<string>> a;set<vector<int>> c;vector<int> initial(26, 0);c.insert(initial);ifstream infile("words.txt");string s;w…...
C++ stl中的set、multiset、map、multimap的相关函数用法
文章目录 序列式容器和关联式容器树形结构和哈希结构树形结构哈希结构 键值对setset的相关介绍set定义方式set相关成员函数multiset mapmap的相关介绍map定义方式map的相关操作1.map的插入2.map的查找3.map的删除 序列式容器和关联式容器 CSTL中包含了序列式容器和关联式容器&…...
普通IT的股票交易成长史--20250511 美元与美股强相关性
声明:本文章的内容非原创。参考了yt博主Andy Lee的观点,为了加深自己的学习印象才做的复盘,不构成投资建议。感谢他的无私奉献! 送给自己的话: 仓位就是生命,绝对不能满仓!!&#x…...
系统架构设计(四):架构风格总结
黑板 概念 黑板体系架构是一种用于求解复杂问题的软件架构风格,尤其适合知识密集型、推理驱动、数据不确定性大的场景。 它模拟了人类专家协同解决问题的方式,通过一个共享的“黑板”协同多个模块(专家)逐步构建解决方案。 组…...
ElasticSearch进阶
一、文档批量操作 1.批量获取文档数据 批量获取文档数据是通过_mget的API来实现的 (1)在URL中不指定index和type 请求方式:GET请求地址:_mget功能说明 : 可以通过ID批量获取不同index和type的数据请求参数: docs : 文档数组参…...
0基础 | L298N电机驱动模块 | 使用指南
引言 在嵌入式系统开发中,电机驱动是一个常见且重要的功能。L298N是一款高电压、大电流电机驱动芯片,广泛应用于各种电机控制场景,如直流电机的正反转、调速,以及步进电机的驱动等。本文将详细介绍如何使用51单片机来控制L298N电…...
Synchronized与锁升级
一、面试题 1)谈谈你对Synchronized的理解 2)Sychronized的锁升级你聊聊 3)Synchronized实现原理,monitor对象什么时候生成的?知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛&#…...
MNIST DDP 分布式数据并行
Distributed Data Parallel 转自我的个人博客:https://shar-pen.github.io/2025/05/04/torch-distributed-series/3.MNIST_DDP/ The difference between DistributedDataParallel and DataParallel is: DistributedDataParallel uses multiprocessing where a proc…...
语音合成之十三 中文文本归一化在现代语音合成系统中的应用与实践
中文文本归一化在现代语音合成系统中的应用与实践 引言理解中文文本归一化(TN)3 主流LLM驱动的TTS系统及其对中文文本归一化的需求分析A. SparkTTS(基于Qwen2.5)与文本归一化B. CosyVoice(基于Qwen)与文本归…...
9.1.领域驱动设计
目录 一、领域驱动设计核心哲学 战略设计与战术设计的分野 • 战略设计:限界上下文(Bounded Context)与上下文映射(Context Mapping) • 战术设计:实体、值对象、聚合根、领域服务的构建原则 统一语言&am…...
如何配置光猫+路由器实现外网IP访问内部网络?
文章目录 前言一、网络拓扑理解二、准备工作三、光猫配置3.1 光猫工作模式3.2 光猫端口转发配置(路由模式时) 四、路由器配置4.1 路由器WAN口配置4.2 端口转发配置4.3 动态DNS配置(可选) 五、防火墙设置六、测试配置七、安全注意事…...
C++题题题题题题题题题踢踢踢
后缀表达式求值 #include<bits/stdc.h> #include<algorithm> using namespace std; string a[100]; string b[100]; stack<string> op; int la0,lb0; int main(){while(true){cin>>a[la];if(a[la]".") break;la;}for(int i0;i<la;i){if(…...
M. Moving Both Hands(反向图+Dijkstra)
Problem - 1725M - Codeforces 题目大意:给你一个有向图,起始点在1,问起始点分别与另外n-1个 点相遇的最短时间,无法相遇输出-1。 思路:反向建图,第一层建原图,第二层建反向图,两层…...
11、参数化三维产品设计组件 - /设计与仿真组件/parametric-3d-product-design
76个工业组件库示例汇总 参数化三维产品设计组件 (注塑模具与公差分析) 概述 这是一个交互式的 Web 组件,旨在演示简单的三维零件(如带凸台的方块)的参数化设计过程,并结合注塑模具设计(如开模动画)与公…...
智能座舱开发工程师面试题
一、基础知识类 简述智能座舱的核心组成部分及其功能 要求从硬件(如显示屏、传感器、控制器)和软件(操作系统、中间件、应用程序)层面展开,阐述各部分如何协同实现座舱的智能化体验。 对比 Android Automotive、QNX…...
【连载14】基础智能体的进展与挑战综述-多智能体系统设计
基础智能体的进展与挑战综述 从类脑智能到具备可进化性、协作性和安全性的系统 【翻译团队】刘军(liujunbupt.edu.cn) 钱雨欣玥 冯梓哲 李正博 李冠谕 朱宇晗 张霄天 孙大壮 黄若溪 在基于大语言模型的多智能体系统(LLM-MAS)中,合作目标和合…...
06.three官方示例+编辑器+AI快速学习webgl_animation_skinning_additive_blending
本实例主要讲解内容 这个Three.js示例展示了**骨骼动画(Skinning)和变形动画(Morphing)**的结合应用。通过加载一个机器人模型,演示了如何同时控制角色的肢体动作和面部表情,实现更加丰富的角色动画效果。 核心技术包括: 多动画混合与淡入…...
【Java学习日记36】:javabeen学生系统
ideal快捷键...
.Net HttpClient 使用请求数据
HttpClient 使用请求数据 0、初始化及全局设置 //初始化:必须先执行一次 #!import ./ini.ipynb1、使用url 传参 参数放在Url里,形如:http://www.baidu.com?namezhangsan&age18, GET、Head请求用的比较多。优点是简单、方便࿰…...
详解 Java 并发编程 synchronized 关键字
synchronized 关键字的作用 synchronized 是 Java 中用于实现线程同步的关键字,主要用于解决多线程环境下的资源竞争问题。它可以修饰方法或代码块,确保同一时间只有一个线程可以执行被修饰的代码,从而避免数据不一致的问题。 synchronized…...
《Go小技巧易错点100例》第三十二篇
本期分享: 1.sync.Map的原理和使用方式 2.实现有序的Map sync.Map的原理和使用方式 sync.Map的底层结构是通过读写分离和无锁读设计实现高并发安全: 1)双存储结构: 包含原子化的 read(只读缓存,无锁快…...
时序约束高级进阶使用详解四:Set_False_Path
目录 一、背景 二、Set_False_Path 2.1 Set_false_path常用场景 2.2 Set_false_path的优势 2.3 Set_false_path设置项 2.4 细节区分 三、工程示例 3.1 工程代码 3.2 时序约束如下 3.3 时序报告 3.4 常规场景 3.4.1 设计代码 3.4.2 约束场景 3.4.3 约束对象总结…...
每日定投40刀BTC(16)20250428 - 20250511
定投 坚持 《恒道》 长河九曲本微流,岱岳摩云起累丘。 铁杵十年销作刃,寒窗五鼓淬成钩。已谙蜀栈盘空险,更蓄湘竹带泪遒。 莫问枯荣何日证,星霜满鬓亦从头。...
C# 高效处理海量数据:解决嵌套并行的性能陷阱
C# 高效处理海量数据:解决嵌套并行的性能陷阱 问题场景 假设我们需要在 10万条ID 和 1万个目录路径 中,快速找到所有满足以下条件的路径: 路径本身包含ID字符串该路径的子目录中也包含同名ID 初始代码采用Parallel.ForEach嵌套Task.Run&am…...
【Java EE初阶 --- 多线程(初阶)】线程安全问题
乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 ,Java 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 文章目录 线程不安全的原因根本原因…...
从InfluxDB到StarRocks:Grab实现Spark监控平台10倍性能提升
Grab 是东南亚领先的超级应用,业务涵盖外卖配送、出行服务和数字金融,覆盖东南亚八个国家的 800 多个城市,每天为数百万用户提供一站式服务,包括点餐、购物、寄送包裹、打车、在线支付等。 为了优化 Spark 监控性能,Gr…...
《Redis应用实例》学习笔记,第一章:缓存文本数据
前言 最近在学习《Redis应用实例》,这本书并没有讲任何底层,而是聚焦实战用法,梳理了 32 种 Redis 的常见用法。我的笔记在 Github 上,用 Jupyter 记录,会有更好的阅读体验,作者的源码在这里:h…...
Redis 缓存
缓存介绍 Redis 最主要三个用途: 1)存储数据(内存数据库) 2)消息队列 3)缓存 对于硬件的访问速度,通常有以下情况: CPU 寄存器 > 内存 > 硬盘 > 网络 缓存的核心…...
Apache Flink 与 Flink CDC:概念、联系、区别及版本演进解析
Apache Flink 与 Flink CDC:概念、联系、区别及版本演进解析 在实时数据处理和流式计算领域,Apache Flink 已成为行业标杆。而 Flink CDC(Change Data Capture) 作为其生态中的重要组件,为数据库的实时变更捕获提供了强大的能力。 本文将从以下几个方面进行深入讲解: 什…...
缓存(4):常见缓存 概念、问题、现象 及 预防问题
常见缓存概念 缓存特征: 命中率、最大元素、清空策略 命中率:命中率返回正确结果数/请求缓存次数 它是衡量缓存有效性的重要指标。命中率越高,表明缓存的使用率越高。 最大元素(最大空间):缓存中可以存放的最大元素的…...
实战项目6(09)
目录 任务场景一 【r1配置】 【r2配置】 【r3配置】 任务场景二 【r1配置】 【r2配置】 【r3配置】 任务场景三 【r1配置】 【r2配置】 【r3配置】 任务场景一 按照下图完成网络拓扑搭建和配置 任务要求:在…...
MySQL 数据库故障排查指南
MySQL 数据库故障排查指南 本指南旨在帮助您识别和解决常见的 MySQL 数据库故障。我们将从问题识别开始,逐步深入到具体的故障类型和排查步骤。 1. 问题识别与信息收集 在开始排查之前,首先需要清晰地了解问题的现象和范围。 故障现象: 数…...
MacOS Python3安装
python一般在Mac上会自带,但是大多都是python2。 python2和python3并不存在上下版本兼容的情况,所以python2和python3可以同时安装在一台设备上,并且python3的一些语法和python2并不互通。 所以在Mac电脑上即使有自带python,想要使…...
锁相放大技术:从噪声中提取微弱信号的利器
锁相放大技术:从噪声中提取微弱信号的利器 一、什么是锁相放大? 锁相放大(Lock-in Amplification)是一种用于检测微弱信号的技术,它能够从强噪声背景中提取出我们感兴趣的特定信号。想象一下在嘈杂的派对上听清某个人…...
机器学习总结
1.BN【batch normalization】 https://zhuanlan.zhihu.com/p/93643523 减少 2.L1L2正则化 l1:稀疏 l2:权重减小 3.泛化误差 训练误差计算了训练集的误差,而泛化误差是计算全集的误差。 4.dropout 训练过程中神经元p的概率失活 一文彻底搞懂深度学习&#x…...
基于神经网络的无源雷达测向系统仿真实现
基于神经网络的无源雷达测向系统仿真实现 项目概述 本项目实现了基于卷积神经网络(CNN)的无源雷达方向到达角(DOA)估计系统。通过深度学习方法,系统能够从接收到的雷达信号中准确估计出信号源的方向,适用于单目标和多目标场景。相比传统的DOA估计算法&…...
《用MATLAB玩转游戏开发》Flappy Bird:小鸟飞行大战MATLAB趣味实现
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-Flappy Bird:小鸟飞行大战MATLAB趣味实现 文章目录 《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互…...
【C/C++】跟我一起学_C++同步机制效率对比与优化策略
文章目录 C同步机制效率对比与优化策略1 效率对比2 核心同步机制详解与适用场景3 性能优化建议4 场景对比表5 总结 C同步机制效率对比与优化策略 多线程编程中,同步机制的选择直接影响程序性能与资源利用率。 主流同步方式: 互斥锁原子操作读写锁条件变量无锁数据…...
linux 三剑客命令学习
grep Grep 是一个命令行工具,用于在文本文件中搜索打印匹配指定模式的行。它的名称来自于 “Global Regular Expression Print”(全局正则表达式打印),它最初是由 Unix 系统上的一种工具实现的。Grep 工具在 Linux 和其他类 Unix…...
【js基础笔记] - 包含es6 类的使用
文章目录 js基础js 预解析js变量提升 DOM相关知识节点选择器获取属性节点创建节点插入节点替换节点克隆节点获取节点属性获取元素尺寸获取元素偏移量标准的dom事件流阻止事件传播阻止默认行为事件委托 正则表达式js复杂类型元字符 - 基本元字符元字符 - 边界符元字符 - 限定符元…...
《Linux命令行大全(第2版)》PDF下载
内容简介 本书对Linux命令行进行详细的介绍,全书内容包括4个部分,第一部分由Shell的介绍开启命令行基础知识的学习之旅;第二部分讲述配置文件的编辑,如何通过命令行控制计算机;第三部分探讨常见的任务与必备工具&…...
补补表面粗糙度的相关知识(一)
表面粗糙度,或简称粗糙度,是指表面不光滑的特性。这个在机械加工行业内可以说是绝绝的必备知识之一,但往往也是最容易被忽略的,因为往往天天接触的反而不怎么关心,或者没有真正的去认真学习掌握。对于像我一样…...
Python实用工具:pdf转doc
该工具只能使用在英文目录下,且无法转换出图片,以及文本特殊格式。 下载依赖项 pip install PyPDF2 升级依赖项 pip install PyPDF2 --upgrade 查看库版本 python -c "import PyPDF2; print(PyPDF2.__version__)" 下载第二个依赖项 pip i…...
基于Dify实现对Excel的数据分析
在dify部署完成后,大家就可以基于此进行各种应用场景建设,目前dify支持聊天助手(包括对话工作流)、工作流、agent等模式的场景建设,我们在日常工作中经常会遇到各种各样的数据清洗、格式转换处理、数据统计成图等数据分…...
Win全兼容!五五 Excel Word 转 PDF 工具解决多场景转换难题
各位办公小能手们!今天给你们介绍一款超牛的工具——五五Excel Word批量转PDF工具V5.5版。这玩意儿专注搞批量格式转换,能把Excel(.xls/.xlsx)和Word(.doc/.docx)文档唰唰地变成PDF格式。 先说说它的核心功…...
java加强 -Collection集合
集合是一种容器,类似于数组,但集合的大小可变,开发中也非常常用。Collection代表单列集合,每个元素(数据)只包含1个值。Collection集合分为两类,List集合与set集合。 特点 List系列集合&#…...
BGP实验练习1
需求: 要求五台路由器的环回地址均可以相互访问 需求分析: 1.图中存在五个路由器 AR1、AR2、AR3、AR4、AR5,分属不同自治系统(AS),AR1 在 AS 100,AR2 - AR4 在 AS 200,AR5 在 AS …...
Nginx location静态文件映射配置
遇到问题? 以下这个Nginx的配置,愿意为访问https://abc.com会指向一个动态网站,访问https://abc.com/tongsongzj时会访问静态网站,但是配置之后(注意看后面那个location /tongsongzj/静态文件映射的配置)&…...
四、Hive DDL表定义、数据类型、SerDe 与分隔符核心
在理解了 Hive 数据库的基本操作后,本篇笔记将深入到数据存储的核心单元——表 (Table) 的定义和管理。掌握如何创建表、选择合适的数据类型、以及配置数据的读写方式 (特别是 SerDe 和分隔符),是高效使用 Hive 的关键。 一、创建表 (CREATE TABLE)&…...