Golang学习笔记_34——组合模式
Golang学习笔记_31——原型模式
Golang学习笔记_32——适配器模式
Golang学习笔记_33——桥接模式
文章目录
- 一、核心概念
- 1. 定义
- 2. 解决的问题
- 3. 核心角色
- 4. 类图
- 二、特点分析
- 三、适用场景
- 1. 文件系统
- 2. 图形界面
- 3. 组织架构
- 四、代码示例(Go语言)
- 五、高级应用
- 1. 递归统计
- 2. 组合模式 + 访问者模式
- 六、与其他模式对比
- 七、总结
一、核心概念
1. 定义
组合模式(Composite Pattern)是一种结构型设计模式,通过将对象组织成树形结构来表示“部分-整体”的层次关系,使客户端可以统一处理单个对象和组合对象。
2. 解决的问题
- 树形结构表示:需要处理具有层级关系的对象(如文件系统、组织架构)
- 统一操作接口:消除客户端对叶子节点和组合节点的差异感知
- 递归遍历需求:需要递归处理嵌套结构(如计算文件夹总大小)
3. 核心角色
-
Component(抽象组件)
定义所有对象的通用接口,声明管理子组件的方法(如Add()、Remove())和业务方法(如Display()) -
Leaf(叶子节点)
树形结构的末端节点,没有子节点,实现具体业务逻辑 -
Composite(组合节点)
包含子节点的容器,实现组件接口并管理子组件集合
4. 类图


二、特点分析
优点
-
统一接口
客户端无需区分叶子节点和组合节点,简化调用逻辑 -
灵活扩展
新增组件类型无需修改现有代码,符合开闭原则 -
层次清晰
天然支持树形结构表示,便于处理递归操作
缺点
-
设计复杂度高
需要定义抽象接口并处理递归逻辑,增加实现难度 -
类型限制困难
难以约束容器节点只能包含特定类型子组件
三、适用场景
1. 文件系统
- 叶子节点:文件
- 组合节点:文件夹(可包含文件/子文件夹)
- 操作:递归计算总大小、展示目录结构
2. 图形界面
- 叶子节点:按钮、文本框
- 组合节点:面板、窗口
- 操作:统一渲染、事件处理
3. 组织架构
- 叶子节点:员工
- 组合节点:部门
- 操作:统计总人数、打印层级关系
四、代码示例(Go语言)
package compositedemoimport "fmt"// Component 接口
type Component interface {Display(indent string)
}// Leaf 叶子节点
type File struct {Name string
}func (l *File) Display(indent string) {println(indent + l.Name)
}// Directory 组合节点
type Directory struct {Name stringComponent []Component
}func (c *Directory) Display(indent string) {println(indent + c.Name)for _, component := range c.Component {component.Display(indent + indent)}
}func (c *Directory) Add(component Component) {c.Component = append(c.Component, component)
}func (c *Directory) Remove(component Component) {for i, v := range c.Component {if v == component {c.Component = append(c.Component[:i], c.Component[i+1:]...)}}
}func test() {root := &Directory{Name: "root"}directory := &Directory{Name: "directory"}file1 := &File{Name: "file1"}file2 := &File{Name: "file2"}root.Add(directory)directory.Add(file1)directory.Add(file2)root.Display("--")fmt.Println("==========================================")directory.Display("**")
}
=== RUN Test_test
--root
----directory
--------file1
--------file2
==========================================
**directory
****file1
****file2
--- PASS: Test_test (0.00s)
PASS
五、高级应用
1. 递归统计
// 在Component接口添加方法
type FileSystemComponent interface {Size() int
}// File实现
func (f *File) Size() int {return 1024 // 假设固定大小
}// Directory实现
func (d *Directory) Size() int {total := 0for _, child := range d.children {total += child.Size()}return total
}
2. 组合模式 + 访问者模式
通过访问者模式实现更复杂的树形结构操作(如格式转换、权限检查)
六、与其他模式对比
| 模式 | 核心目标 | 关键区别 |
|---|---|---|
| 装饰器 | 动态添加功能 | 通过嵌套包装扩展功能 |
| 适配器 | 接口转换 | 解决接口不兼容问题 |
| 迭代器 | 遍历集合元素 | 专注于遍历算法实现 |
七、总结
组合模式通过树形结构和统一接口,有效解决了以下问题:
- 层次结构表示:天然适合文件系统、组织架构等场景
- 递归操作简化:通过统一接口实现递归遍历
- 扩展性提升:新增组件类型不影响现有结构
在Go语言中实现时需注意:
- 通过接口实现多态特性
- 使用切片管理子组件集合
- 谨慎处理叶子节点的无效方法(如
Add())
相关文章:
Golang学习笔记_34——组合模式
Golang学习笔记_31——原型模式 Golang学习笔记_32——适配器模式 Golang学习笔记_33——桥接模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 文件系统2. 图形界面3. 组织架构 四、代码示例(Go语言)五、…...
以太网详解(八)传输层协议:TCP/UDP 协议
文章目录 传输层协议概述为什么需要传输层?传输层功能网络层与传输层在实现 “端到端” 传输的异同两类服务:面向连接/无连接服务 传输控制协议 TCPTCP 协议数据单元格式TCP 的重传机制快重传和快恢复快重传举例快恢复算法 用户数据报协议 UDPUDP 概述UDP 基本工作过…...
基于Spark抖音评论舆情分析系统
✔️情绪分析、文本挖掘、文本分类,词频统计、情感分析,词云制作,词语共现网络图、人物关系网络建立等 ✔️主营:指导解答anaconda、python数据分析、数据挖掘、词频统计、词云、情感分析、python机器学习、Flask Django web、jup…...
JAVA系列之数组的秘密(数组的一般用法+力扣 斯坦福大学练习精解)
大佬们好呀~ 更多精彩: 个人主页 JAVA专栏 文章目录 一、数组的概述1.1什么是数组?1.2注意:1.3建议: 二、数组的定义1.格式: 三、数组的静态初始化1.数组的初始化:2.静态初始化:格式:数组的长度:…...
探索飞鹤奶粉奥秘,领会科技魅力
在科技迅猛发展的当下,AI 技术正深刻重塑各行业格局。乳制品行业亦不例外。近日,长江商学院「AI 未来空间站」的同学们深入走访了飞鹤集团,探寻其在数字化浪潮中的创新实践与卓越成就。 在飞鹤的智能化生产车间,同学们目睹了高度自…...
【数据仓库】StarRocks docker部署
StarRocks docker部署 一、环境准备安装 docker 及 docker-compose操作系统相关禁用及配置【CentOS Linux 7 (Core)】 二、StarRocks-v2.5【存算一体,3FE,3BE】BE节点配置FE节点配置服务启动BE节点添加FE 节点添加 三、监控(待完善)四、VIP Nginx Keepalived(待完善)五、Star…...
Java虚拟机面试题:内存管理(下)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
R语言用逻辑回归贝叶斯层次对本垒打数据与心脏移植数据后验预测检验模拟推断及先验影响分析|附数据代码...
全文链接:https://tecdat.cn/?p40152 在统计学领域中,层次建模是一种极为强大且实用的工具。它能够巧妙地处理复杂的数据结构,通过分层的方式对数据进行建模。在贝叶斯统计的框架内,层次建模优势尽显,其可以有效地融合…...
网页制作02-html,css,javascript初认识のhtml的文字与段落标记
用一首李白的将进酒,对文字与段落标记进行一个简单的介绍演示: 目录 一、标题字 1、标题字标记h 2、标题字对其属性align 二、文本基本标记 1、字体属性face 2、字号属性size 3、颜色属性 Color 三、文本格式化标记 1、粗体标记 b ,strong 2、…...
【SpringBoot苍穹外卖】debugDay04
一、getById 与 new 我在修改数据时,产生疑问,注释掉是我一开始写得,new对象是答案提供的,我就好奇两者之间区别。 1. 使用 setmealMapper.getById 获取现有对象 Setmeal setmeal setmealMapper.getById(setmealDTO.getId()); …...
C++中的顺序容器(一)
文章目录 顺序容器概述所有容器类型都支持的操作迭代器容器定义与初始化将一个容器初始化为另一个容器的拷贝标准库array具有固定大小 赋值和swap关系运算符 顺序容器的特有操作向顺序容器添加元素访问元素删除元素特殊的forward_list操作改变容器的大小容器操作可能是迭代器失…...
【复现DeepSeek-R1之Open R1实战】系列4:跑通GRPO!
目录 1 配置环境2 训练2.1 命令和配置参数2.2 num_generations2.2.1 参数定义2.2.2 参数含义2.2.3 示例2.2.4 使用场景2.2.5 示例代码 2.3 显存占用和耗时 3 结果 1 配置环境 关于环境配置,可以参考这篇博文:【复现DeepSeek-R1之Open R1实战】系列1&…...
Redis原理简述及发布订阅消息队列
目录 1 什么是Redis 2 Redis 非阻塞IO内部原理 2.1 IO多路复用策略 2.2 Reactor设计模式 3 基于PubSub的消息队列(发布-订阅) 由于集群之后存在多台服务器,并且不同客户端连接的可能是不同的服务器,因此在聊天过程中涉及到服…...
ThreadLocal为什么会内存溢出
每个线程(Thread 对象)内部维护一个 ThreadLocalMap,用于存储该线程的所有 ThreadLocal 变量的键值对: ThreadLocalMap虽然是ThreadLocal的静态内部类,但是Thread 对象的属性,当线程存活时ThreadLocalMap不会被回收。 Key:ThreadLocal 实例的 弱引用(WeakReference)。…...
假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?
前言:本篇文章解释了接口学习过程中的2个常见问题,一个是“为什么是类在使用接口”,另一个一个是“编程接口与物理接口的差异源于所处的抽象层次和交互模式的不同”,旨在揭示编程接口的本质。 Part1.是类在使用接口 当学习接口时…...
数据结构——Makefile、算法、排序(2025.2.13)
目录 一、Makefile 1.功能 2.基本语法和相关操作 (1)创建Makefile文件 (2)编译规则 (3)编译 (4)变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 ÿ…...
算法之 跳跃游戏
文章目录 55.跳跃游戏思路参考:56.合并区间 55.跳跃游戏 55.跳跃游戏 灵神思路 思路分析: 两种思路,思路1是我们可以直接维护当前到达i的时候所能到达的最右的边界mr,如果i>mr就说明无法到达i,否则就是可以到达;…...
C#中的图形渲染模式
在C#中,图形模式通常用于定义如何渲染或处理图形。可以枚举定义如下四种图形模式:AUTO、GDI、DIB 和 FBO。这些模式可能用于指定不同的图形渲染技术或后端。下面是对这些模式的详细解释: 1. AUTO (自动模式) 含义:自动选择最适合…...
二.数据治理流程架构
1、数据治理流程架构核心思想: 该图描绘了一个以数据标准规范体系为核心,大数据生命周期管理为主线,数据资源中心为依托,并辅以数据质量管理和大数据安全与隐私管理的数据治理流程架构。它旨在通过规范化的流程和技术手段&#x…...
瑞萨RA-T系列芯片ADCGPT功能模块的配合使用
在马达或电源工程中,往往需要采集多路AD信号,且这些信号的优先级和采样时机不相同。本篇介绍在使用RA-T系列芯片建立马达或电源工程时,如何根据需求来设置主要功能模块ADC&GPT,包括采样通道打包和分组,GPT触发启动…...
Spark NLP:工业级分布式自然语言处理框架实战指南
1. 项目概述:当Spark遇上NLP,一个工业级文本处理框架的诞生如果你在数据科学或机器学习领域工作过一段时间,尤其是处理过海量文本数据,那你一定对两个词深有体会:一个是“慢”,另一个是“复杂”。传统的自然…...
医学实体识别技术与临床决策支持系统实践
1. 医学实体识别技术基础解析医学实体识别(Medical Named Entity Recognition, M-NER)作为医疗自然语言处理的核心技术,其本质是从非结构化的医疗文本中识别并分类具有特定医学意义的实体。与通用领域的NER不同,医疗文本中的实体识…...
NF-κB信号通路的机制、生物学功能、疾病关联及靶向治疗研究进展
一、NF-κB信号通路在疾病机制与靶向治疗中的研究进展一项关于NF-κB信号通路的研究《 NF-κBin biology and targeted therapy: new insights and translational implications》发表于Signal Transduction and Targeted Therapy期刊。该研究系统梳理了NF-κB信号通路的组成、激…...
为什么92%的数据团队卡在Tidyverse 2.0安装环节?资深R架构师亲授7大避坑清单(含Windows/macOS/Linux全平台适配)
更多请点击: https://intelliparadigm.com 第一章:Tidyverse 2.0自动化数据报告插件的核心价值与架构演进 Tidyverse 2.0 并非简单版本迭代,而是围绕“可重复性”“可审计性”与“低代码交互性”三大原则重构的数据科学工作流中枢。其核心插…...
题解:AcWing 6031 计算
本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…...
双芯协同破局 AI 落地痛点 英特尔重新定义新一代 AI 工作站
4 月 23 日,英特尔在北京举办新一代 AI 工作站平台发布会,正式推出代号 Granite Rapid 的至强 600 系列工作站处理器、锐炫 Pro B70/B65 专业级 GPU 两大核心产品。在智能体应用全面爆发、AI 算力从云端向端侧深度下沉的行业拐点,英特尔以 “…...
5步轻松搞定小红书内容批量采集:XHS-Downloader终极使用指南
5步轻松搞定小红书内容批量采集:XHS-Downloader终极使用指南 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链…...
美业门店的数字化之路:轻量工具,精准适配
在美业领域,美发、美甲类小微门店与工作室,是行业里最具活力也最辛苦的群体。大多是 3 人以下的小团队,没有专职前台,老板往往身兼数职 —— 既要做技术、接待顾客,又要管收银、记会员、算业绩,日常琐碎事务…...
02华夏之光永存・开源:黄大年茶思屋榜文解法「第24期 第2题」 基于自动控制闭环的网络自适应技术专项完整解法
02华夏之光永存・开源:黄大年茶思屋榜文解法「第24期 第2题」 基于自动控制闭环的网络自适应技术专项完整解法 一、摘要 本题归属ADN自动驾驶网络闭环自适应调度领域,全球现代工程技术已触达绝对天花板,现有开环调度框架、流量预测模型、传统…...
2025届学术党必备的五大AI辅助写作神器横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 使文本里人工智能生成所留痕迹得以降低,能够采用下面这些指令优化策略。首先&…...
