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

组合模式(Composite Pattern)

非常棒!你现在进入了结构型设计模式中最典型的「树形结构」设计模式 —— 组合模式(Composite Pattern)

我将通过简明解释 + 清晰代码 + 类图演示,一步步帮你理解它。


🧠 一句话定义

组合模式允许你将对象组合成树形结构来表示“整体-部分”的层次结构,客户端对单个对象和组合对象使用一致的方式处理。


🎯 生活类比

你有一个文件夹,里面可以包含:

  • 文件(不可分)
  • 子文件夹(可以再包含文件/子文件夹)

你希望:

✅ 用一样的方式对文件和文件夹进行操作(比如查看大小、遍历等)

这就是组合模式的典型应用!


✅ 为什么需要组合模式?

问题组合模式的解决
对象和容器对象要统一处理定义统一接口 Component
容器嵌套容器,不方便操作用递归统一管理结构
添加层次后代码爆炸容器类和单元类都实现统一接口,客户端不需要 if 判断

✅ 优点 vs ❌ 缺点

✅ 优点❌ 缺点
结构灵活,统一管理容器与单元职责不够明确(都实现统一接口)
客户端统一使用接口修改会影响所有子类
支持递归组合对于简单结构显得复杂

🐍 Python 示例:文件系统结构(组合 + 递归)


1️⃣ 抽象组件(统一接口)

from abc import ABC, abstractmethod# 抽象组件(无论是文件还是文件夹,都要实现 show 方法)
class FileSystemComponent(ABC):def __init__(self, name):self.name = name@abstractmethoddef show(self, indent=0):"""显示内容,子类必须实现"""pass

2️⃣ 叶子节点:文件(不可再包含)

class File(FileSystemComponent):def show(self, indent=0):# 打印文件名,加上缩进表示层级print(" " * indent + f"📄 文件: {self.name}")

3️⃣ 容器节点:文件夹(可嵌套)

class Folder(FileSystemComponent):def __init__(self, name):super().__init__(name)self.children = []  # 保存子文件或子文件夹def add(self, component: FileSystemComponent):# 向文件夹添加一个子组件(可能是 File 或 Folder)self.children.append(component)def show(self, indent=0):# 先打印当前文件夹名称(缩进代表层级)print(" " * indent + f"📁 文件夹: {self.name}")# 遍历所有子项,并递归调用每个子项的 show()for child in self.children:child.show(indent + 2)  # 缩进增加两格,表示进入下一层

🧠 一句话总结递归含义:
✅ 文件夹是自包含的容器,调用自己的 .show() 方法时,会再去调用所有子组件的 .show(),直到叶子节点(文件)为止。

4️⃣ 客户端使用

# 创建文件夹结构:根目录 → 文档 & 图片文件夹
root = Folder("根目录")
doc = Folder("文档")
img = Folder("图片")# 添加文件到文档文件夹
doc.add(File("简历.docx"))
doc.add(File("合同.pdf"))# 添加文件到图片文件夹
img.add(File("照片1.jpg"))
img.add(File("照片2.png"))# 构建总结构
root.add(doc)              # 根目录包含文档
root.add(img)              # 根目录包含图片
root.add(File("readme.txt"))  # 根目录包含一个独立文件# 展示结构(递归触发入口)
root.show()

✅ 输出结果:

📁 文件夹: 根目录📁 文件夹: 文档📄 文件: 简历.docx📄 文件: 合同.pdf📁 文件夹: 图片📄 文件: 照片1.jpg📄 文件: 照片2.png📄 文件: readme.txt

✅ 说明:对文件和文件夹使用同样的 .show() 方法,自动递归展示结构。


🧭 清晰完整类图(Mermaid)

包含多个
FileSystemComponent
-name
+show(indent)
File
+show(indent)
Folder
-children
+add(component)
+show(indent)

🧠 应用场景

应用领域示例
文件系统文件和目录统一管理
组织架构员工和部门层级
UI 组件按钮、容器、面板等统一渲染
数学表达式树节点可以是值,也可以是组合表达式

🧠 总结口诀

✅ 组合模式:把单个和一群统一看待,一起操作不区分
使用场景:整体-部分结构 + 客户端无需区分子节点/组合节点


是否想要我补充一个 UI 控件树 或 公司组织树 的组合模式版本?
📁📄📂 或者我帮你把这一套生成成图文学习卡片?继续深入?

相关文章:

组合模式(Composite Pattern)

非常棒!你现在进入了结构型设计模式中最典型的「树形结构」设计模式 —— 组合模式(Composite Pattern)。 我将通过简明解释 清晰代码 类图演示,一步步帮你理解它。 🧠 一句话定义 组合模式允许你将对象组合成树形结…...

Java捕获InterruptedException异常后,会自动清空中断状态

InterruptedException异常一般是在一个线程处于等待(像Thread.sleep()、Object.wait()、Thread.join()等方法)状态时被另一个线程调用interrupt()方法中断而抛出的。一旦捕获到InterruptedException,Java 会自动清除该线程的中断状态。 以下…...

HTML04:图像标签

图像标签 常见的图像标签 JPGGIFPNGBMP <img src"路径" alt"名称" title"悬停名称" width"高" height"宽"/><!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…...

供应链算法整理(二)--- 智能补货

供应链业务的目标价值是&#xff1a;优化货品的供给、销售提供支撑&#xff0c;以降低成本&#xff0c;提高时效、收益&#xff0c;最终提升用户体验。基于目标价值&#xff0c;整体的算法模块分为&#xff1a;智能选品、智能预测、品仓铺货、智能补货、智能调拨、仓网路由、快…...

【毕设通关】——Word交叉引用

&#x1f4d6; 前言&#xff1a;在论文中&#xff0c;我们经常会在文段贴图片时&#xff0c;写“如图x所示”的内容&#xff0c;如果每次都手动写数字&#xff0c;那么当需要在前面内容插入图片时&#xff0c;后续更新会很繁琐&#xff0c;这时就需要交叉引用功能。 &#x1f5…...

java技术总监简历模板

模板信息 简历范文名称&#xff1a;java技术总监简历模板&#xff0c;所属行业&#xff1a;其他 | 职位&#xff0c;模板编号&#xff1a;XDNUTA 专业的个人简历模板&#xff0c;逻辑清晰&#xff0c;排版简洁美观&#xff0c;让你的个人简历显得更专业&#xff0c;找到好工作…...

视频编解码学习三之显示器

整理自&#xff1a;显示器_百度百科&#xff0c;触摸屏_百度百科,百度安全验证 分为阴极射线管显示器&#xff08;CRT&#xff09;&#xff0c;等离子显示器PDP&#xff0c;液晶显示器LCD 液晶显示器的组成。一般来说&#xff0c;液晶显示器由以下几个部分组成&#xff1a; […...

【人工智能】大模型安全的深度剖析:DeepSeek漏洞分析与防护实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的广泛应用,其安全性问题日益凸显。DeepSeek作为中国领先的开源AI模型,以低成本和高性能著称,但近期暴露的数据库…...

架构思维:使用懒加载架构实现高性能读服务

文章目录 一、引言二、读服务的功能性需求三、两大基本设计原则1. 架构尽量不要分层2. 代码尽可能简单 四、实战方案&#xff1a;懒加载架构及其四大挑战五、改进思路六、总结与思考题 一、引言 在任何后台系统设计中&#xff0c;「读多写少」的业务场景占据主流&#xff1a;浏…...

【AI提示词】黑天鹅模型专家

提示说明 详细解释黑天鹅模型的理论背景、定义、分类及其在不同领域的应用。 提示词 # Role: 黑天鹅模型专家## Profile - language: 中文 - description: 详细解释黑天鹅模型的理论背景、定义、分类及其在不同领域的应用 - background: 黑天鹅模型是尼尔斯莫尔提出的理论&a…...

pip安装包时网络不畅,替换国内PyPI镜像源

1、PyPI 镜像源 1.1、定义 PyPI 镜像源是对 Python Package Index&#xff08;PyPI&#xff09;官方仓库的复制。 PyPI 是 Python 社区中最大的软件包仓库&#xff0c;存储着大量的 Python 包&#xff0c;供开发者们下载和使用。 然而&#xff0c;由于 PyPI 服务器位于国外&a…...

TS 类型推论

应用场景&#xff1a; 1.变量初始化 仅声明不初始化无法推断是什么类型&#xff0c;必须手动添加类型注解 2.决定函数返回值 根据函数体内的运算可以推断出返回值的类型 函数参数的类型声明建议一定要手写...

Java基于SaaS模式多租户ERP系统源码

目录 一、系统概述 二、开发环境 三、系统功能介绍 一、系统概述 ERP&#xff0c;全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统&#xff0c;它通过信息技术手段&#xff0c;将企业的各个业务流程和资源管理进行整合&#xff0c;以提高企业…...

PHP的include和require

文章目录 环境require和includerequire VS includerequire&#xff08;include&#xff09; VS require_once&#xff08;include_once&#xff09;路径问题当前工作目录对相对路径的影响题外话总结其它 参考 环境 Windows 11 专业版XAMPP v3.3.0 PHP 8.2.12Apache 2.4.58 VSC…...

日本人工智能发展全景观察:从技术革新到社会重构的深度解析

一、日本IT产业演进与AI技术崛起的历史脉络 1.1 信息化时代的奠基&#xff08;1990-2010&#xff09; 日本IT产业的腾飞始于"信息高速公路计划"的实施。1994年NTT推出全球首个商用光纤网络&#xff0c;至2005年实现全国光纤覆盖率突破80%。这一时期培育出富士通、N…...

什么是DGI数据治理框架?

DGI数据治理框架是由数据治理研究所&#xff08;Data Governance Institute, DGI&#xff09;提出的一套系统性方法论&#xff0c;旨在帮助企业或组织建立有效的数据治理体系&#xff0c;确保数据资产的高质量管理、合规使用和价值释放。以下是关于DGI数据治理框架的核心内容&a…...

[硬件电路-12]:LD激光器与DFB激光器功能概述、管脚定义、功能比较

一、LD激光器&#xff08;普通半导体激光器&#xff09;功能 核心功能&#xff1a; LD激光器通过半导体材料的电子-空穴复合实现受激辐射&#xff0c;将电能直接转换为高相干性激光&#xff0c;是光电子系统的核心光源。 基础光发射功能 工作原理&#xff1a;正向偏置电流注入…...

升级 CUDA Toolkit 12.9 与 cuDNN 9.9.0 后验证指南:功能与虚拟环境检测

#工作记录 在 NVIDIA 发布 CUDA Toolkit 12.9 与 cuDNN 9.9.0 后&#xff0c;开发者纷纷选择升级以获取新特性和性能提升。 CUDA Toolkit 12.9 与 cuDNN 9.9.0 发布&#xff0c;带来全新特性与优化-CSDN博客 然而&#xff0c;升级完成并不意味着大功告成&#xff0c;确认升级后…...

湖仓一体架构解析:如何平衡数据灵活性与分析性能?

一、什么是湖仓一体架构&#xff1f;解决哪些核心问题&#xff1f; 在数据爆炸的时代&#xff0c;企业面临着如何高效处理和分析海量数据的挑战。传统架构难以同时满足灵活性和性能需求&#xff0c;湖仓一体架构应运而生。 传统数据架构的局限 数据湖&#xff08;存储各类原…...

56、【OS】【Nuttx】编码规范解读(四)

背景 接之前 blog 53、【OS】【Nuttx】编码规范解读&#xff08;一&#xff09; 54、【OS】【Nuttx】编码规范解读&#xff08;二&#xff09; 55、【OS】【Nuttx】编码规范解读&#xff08;三&#xff09; 分析了行宽格式&#xff0c;注释要求&#xff0c;花括号风格等&#…...

MySQL基础关键_007_DQL 练习

目 录 一、题目 二、答案&#xff08;不唯一&#xff09; 1.查询每个部门薪资最高的员工信息 2.查询每个部门高于平均薪水的员工信息 3. 查询每个部门平均薪资等级 4.查询部门中所有员工薪资等级的平均等级 5.不用分组函数 max 查询最高薪资 6.查询平均薪资最高的部门编…...

气泡图、桑基图的绘制

1、气泡图 使用气泡图分析某一年中国同欧洲各国之间的贸易情况。 气泡图分析的三个维度&#xff1a; • 进口额&#xff1a;横轴 • 出口额&#xff1a;纵轴 • 进出口总额&#xff1a;气泡大小 数据来源&#xff1a;链接: 国家统计局数据 数据概览&#xff08;进出口总额&…...

数据库Mysql_联合查询

或许自己的不完美才是最完美的地方&#xff0c;那些让自己感到不安的瑕疵&#xff0c;最终都会变成自己的特色。 ----------陳長生. 1.介绍 1.1.为什么要进行联合查询 在数据设计的时候&#xff0c;由于范式的需求&#xff0c;会被分为多个表&#xff0c;但是当我们要查询数据…...

数字孪生:解码智慧城市的 “数字神经系统”

当城市规模以惊人速度扩张&#xff0c;传统管理模式在交通拥堵、能源浪费、应急响应滞后等问题面前渐显乏力。数字孪生技术正以 “数字镜像” 重构城市运作逻辑&#xff0c;为智慧城市装上一套高效、智能的 “数字神经系统”。通过将物理世界的城市映射到虚拟空间&#xff0c;实…...

开源项目:optimum-quanto库介绍

项目地址&#xff1a;https://github.com/huggingface/optimum-quanto 官网介绍&#xff1a;https://huggingface.co/blog/quanto-introduction 量化是一种技术&#xff0c;通过使用低精度数据类型&#xff08;如 8 位整数 &#xff08;int8&#xff09;&#xff09;而不是通常…...

C++学习:六个月从基础到就业——C++11/14:lambda表达式

C学习&#xff1a;六个月从基础到就业——C11/14&#xff1a;lambda表达式 本文是我C学习之旅系列的第四十篇技术文章&#xff0c;也是第三阶段"现代C特性"的第二篇&#xff0c;主要介绍C11/14中引入的lambda表达式。查看完整系列目录了解更多内容。 引言 Lambda表达…...

cesium基础设置

在上节新建的程序中,我们会看到有一行小字: 原因为我们没有输入token,想要让这行小字消失的方法很简单,前往cesium的官网注册账号申请token.然后在App.vue中如下方式添加token 保存后即可发现小字消失. 如果连logo都想去掉呢? 在源代码中,我们初始化了一个viwer,即查看器窗口…...

一些好玩的东西

‌&#x1f680; 终极挑战&#xff1a;用 curl 玩《星球大战》‌ telnet towel.blinkenlights.nl # 其实不是 curl&#xff0c;但太经典了&#xff01; ‌效果‌&#xff1a;在终端播放 ASCII 版《星球大战》电影&#xff01;&#xff08;如果 telnet 不可用&#xff0c;可以试…...

ActiveMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 的选型参考(二)

ActiveMQ、Kafka 和 RocketMQ 详细对比 性能对比 在性能方面&#xff0c;Kafka 和 RocketMQ 通常在高吞吐量场景下表现出色&#xff0c;而 ActiveMQ 则相对较弱。根据相关测试数据表明&#xff0c;Kafka 在处理大规模日志数据时&#xff0c;单机吞吐量可以达到每秒数十万条甚…...

HTML学习笔记(7)

一、什么是jQuery jQuery 是一个 JavaScript 库。他实现了JavaScript的一些功能&#xff0c;并封装起来&#xff0c;对外提供接口。 例子实现一个点击消失的功能&#xff0c;用JavaScript实现 <!DOCTYPE html> <html lang"en"> <head><meta …...

Jenkis安装、配置及账号权限分配保姆级教程

Jenkis安装、配置及账号权限分配保姆级教程 安装Jenkins下载Jenkins启动Jenkins配置Jenkins入门Jenkins配置配置中文配置前端自动化任务流新建任务拉取代码打包上传云服务并运行配置后端自动化任务流新建任务拉取代码打包上传云服务并运行账号权限分配创建用户分配视图权限安装…...

面向对象编程(Object-Oriented Programming, OOP)是什么?

李升伟 编译 简介 如果你已经接触过软件开发领域的话&#xff0c;你肯定听说过"面向对象编程"&#xff08;Object-Oriented Programming, OOP&#xff09;这个术语。但你知道什么是OOP吗&#xff1f;为什么它如此重要&#xff1f;在这篇文章中我们将深入解析OOP的基…...

Hotspot分析(1):单细胞转录组识别信息基因(和基因模块)

这一期我们介绍一个常见的&#xff0c;高分文章引用很高的一个单细胞转录组分析工具Hotspot&#xff0c;它可针对单细胞转录组数据识别有意义基因或者基因module&#xff0c;类似于聚类模块。所谓的”informative "的基因是那些在给定度量中相邻的细胞之间以相似的方式表达…...

从图文到声纹:DeepSeek 多模态技术的深度解析与实战应用

目录 一、引言二、DeepSeek 技术基础2.1 架构与原理2.2 多模态能力概述 三、文本与图像关联应用3.1 图文跨模态对齐技术3.1.1 技术原理3.1.2 DeepSeek 的独特方法 3.2 图像生成与文本描述3.2.1 应用案例3.2.2 技术实现 3.3 多模态检索系统中的应用3.3.1 系统搭建流程3.3.2 实际…...

cuDNN 9.9.0 便捷安装-Windows

#工作记录 从 CUDA12.6.3 和 cuDNN9.6.0 版本起&#xff0c;开启了使用 exe 安装包直接进行安装升级的支持模式&#xff0c;彻底改变了以往那种繁琐的安装流程。 在这两个版本之前&#xff0c;开发者在安装 CUDA 和 cuDNN 时&#xff0c;不得不手动下载 cuDNN 压缩包&#xf…...

profile软件开发中的性能剖析与内存分析

在软件开发中&#xff0c;“Profile”&#xff08;性能剖析/性能分析&#xff09;指的是通过工具详细监控程序运行时的各种性能指标&#xff0c;帮助开发者定位代码中的效率瓶颈或资源问题。当有人建议你 “profile 一下内存问题” 时&#xff0c;本质上是让你用专业工具动态分…...

0.0973585?探究ts_rank的score为什么这么低

最近在使用postgres利用ts_rank进行排序找到最符合关键词要求得内容时发现: 即使是相似的内容,得分也是非常非常得低(其中一个case是0.0973585)。看起来很奇怪,非常不可行。于是我又做了一个简单测的测试: SELECT ts_rank(to_tsvector(english, skirt), to_tsquery(skirt)…...

架构思维:利用全量缓存架构构建毫秒级的读服务

文章目录 一、引言二、全量缓存架构概述三、基于 Binlog 的缓存同步方案1. Binlog 原理2. 同步中间件3. 架构整合核心收益 四、Binlog 全量缓存的优缺点与优化优点缺点与取舍优化策略 五、其他进阶优化点六、总结 一、引言 架构思维&#xff1a;使用简洁的架构实现高性能读服务…...

永磁同步电机控制算法--基于PI的位置伺服控制

一、原理介绍 永磁同步伺服系统是包含了电流环、速度环和位置环的三环控制系统。 伺服系统通过电流检测电路和光电编码器检测电动机三相绕组电流和转子位置θ&#xff0c;通过坐标变换&#xff0c;计算出转矩电流分量iq和励磁电流分量id。 位置信号指令与实际转子位置信号的差…...

P1603 斯诺登密码详解

这个题目&#xff0c;我详细讲题解的两种方法&#xff0c;洛谷里面的题解&#xff0c;我是觉得大部分的时候是差了点意思的&#xff0c;不是看不懂&#xff0c;就是新知识没人详细讲解&#xff0c;我也是经常破防 先看题目&#xff1a; 题目是什么意思&#xff1a; 1&#xf…...

计算方法实验六 数值积分

【实验性质】综合性实验。 【实验目的】理解插值型积分法&#xff1b;掌握复化积分法算法。 【实验内容】 1对 &#xff0c;用复化梯形积分和变步长梯形积分求值&#xff08;截断误差不超过&#xff09;。 【理论基础】 积分在工程中有重要的应用&#xff0c;数值积分…...

avx指令实现FFT

avx指令实现FFT 参考代码实现的难点补充的avx指令fft_avx256实现可继续优化的点 C语言实现FFT变换参考的代码是参考大模型生成的代码&#xff0c;很明显其使用的是位反转和蝶形变换的方法实现的FFT变换。但是大模型无法正确的生成用avx指令写的FFT变换的算法&#xff0c;所以这…...

Nginx 核心功能之正反代理

目录 一、Nginx 二、正向代理 三、反向代理 四、Nginx 缓存 1. 缓存功能的核心原理和缓存类型 2. 代理缓存功能设置 五、Nginx rewrite和正则 &#xff08;1&#xff09;Nginx 正则 &#xff08;2&#xff09;nginx location &#xff08;3&#xff09;Rewrite &…...

function包装器的意义

一&#xff1a;function包装器的概念 function包装器 也叫作适配器。C中的function本质是一个类模板&#xff0c;也是一个包装器。 二&#xff1a;需要function包装器的场景 那么我们来看看&#xff0c;我们为什么需要function呢&#xff1f; 一个需要包装器的场景&#xff1a…...

【ThinkBook 16+ 电脑重做系统type-c接口部分功能失效解决方案】

ThinkBook 16 电脑重做系统type-c接口部分功能失效解决方案 问题回顾&#xff1a;重做电脑后&#xff0c;type-c接口部分功能失效&#xff0c;充电正常&#xff0c;连接外置硬盘正常&#xff0c;无法连接外拓显示器&#xff0c;显示usbc无信号&#xff08;不同设备可能显示不同…...

【言语理解】中心理解题目之选项分析

front:中心理解题目之结构分析 4.1两出处六有误 两出处 背景、例子、分析论证中提炼的选项出处有误&#xff0c;一般不选但是和因此之前、不是而是 的不是部分、被指代部分提炼的选项出处有误&#xff0c;一般不选。 六有误 片面&#xff1a;原文并列谈论两方面&#xff0c;只…...

[原创](现代Delphi 12指南):[macOS 64bit App开发]: [1]如何加载动态链接库, 并无缝支持原生底层开发?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

VTK入门指南

什么是VTK VTK (Visualization Toolkit) 是一个开源的、跨平台的计算机图形学、图像处理和可视化系统。它提供了丰富的算法和高级工具&#xff0c;用于3D计算机图形学、图像处理和可视化。 安装VTK Windows平台 下载预编译版本&#xff1a; 从VTK官网或GitHub发布页面下载 …...

开始一个vue项目-day2

这次新增的功能有&#xff1a; 1、使用cookie存储token 参考网站:https://vueuse.org/ 安装包&#xff1a; npm i vueuse/integrations npm i universal-cookie^7 2、cookie的设置读取和删除&#xff0c;代码&#xff1a;composables/auth.js import { useCookies } from …...

Baklib驱动企业知识管理AI升级

Baklib如何实现知识AI化 Baklib通过构建企业级知识中台的核心能力&#xff0c;将人工智能技术深度融入知识管理的全生命周期。其底层架构采用自然语言处理&#xff08;NLP&#xff09;与机器学习算法&#xff0c;实现对企业文档的智能分类与语义解析。例如&#xff0c;系统可自…...