设计模式每日硬核训练 Day 14:组合模式(Composite Pattern)完整讲解与实战应用

🔄 回顾 Day 13:桥接模式小结

在 Day 13 中,我们学习了桥接模式(Bridge Pattern):

  • 用于将“抽象”与“实现”分离,适用于双维度变化场景(如图形类型 × 渲染方式)。
  • 它强调组合替代继承,解决类爆炸问题,提升系统可扩展性。

今天我们进入一个构建层级结构的重要模式——组合模式(Composite Pattern)

组合模式的目标是:让你以一致的方式对待单个对象和对象集合(树形结构)


一、组合模式的核心动机

✅ 什么是组合模式?

组合模式用于构建树状结构的对象系统,例如:

  • 文件夹包含文件和子文件夹
  • UI 容器包含多个控件
  • 公司组织结构:员工 ← 部门 ← 公司

核心哲学:

将对象组成树形结构,客户端可以“统一操作”叶子节点与中间节点。


二、UML 结构图

+----------------+
|   Component    |<------------------------------+
+----------------+                               |
| +operation()   |                               |
+----------------+                               |/\                                        |/  \                                       |
+-------------------+     +---------------------+ |
|  Leaf             |     |  Composite           | |
+-------------------+     +---------------------+ |
| +operation()      |     | +add(Component*)     | || +remove(Component*)  | || +operation()         | |+---------------------+ |

在这里插入图片描述


三、角色说明

角色职责说明
Component抽象类,统一接口
Leaf叶子节点,实现具体功能,不含子节点
Composite组合节点,内部维护子组件列表

四、C++ 实现:文件系统结构

✅ 抽象组件接口

class FileSystemNode {
public:virtual void display(int depth = 0) = 0;virtual ~FileSystemNode() = default;
};

✅ 叶子节点:文件

class File : public FileSystemNode {std::string name_;
public:File(const std::string& name) : name_(name) {}void display(int depth = 0) override {std::cout << std::string(depth, '-') << name_ << std::endl;}
};

✅ 组合节点:文件夹

class Directory : public FileSystemNode {std::string name_;std::vector<std::unique_ptr<FileSystemNode>> children_;public:Directory(const std::string& name) : name_(name) {}void add(std::unique_ptr<FileSystemNode> node) {children_.emplace_back(std::move(node));}void display(int depth = 0) override {std::cout << std::string(depth, '-') << name_ << "/" << std::endl;for (const auto& child : children_) {child->display(depth + 2);}}
};

✅ 使用示例

int main() {auto root = std::make_unique<Directory>("root");root->add(std::make_unique<File>("file1.txt"));auto subDir = std::make_unique<Directory>("subdir");subDir->add(std::make_unique<File>("file2.txt"));subDir->add(std::make_unique<File>("file3.txt"));root->add(std::move(subDir));root->display();return 0;
}

输出:

root/
--file1.txt
--subdir/
----file2.txt
----file3.txt

五、组合模式适用场景

场景对象树结构说明
操作系统文件系统文件 + 文件夹,操作接口统一
图形界面控件窗口、容器、按钮、文本框构成控件树
公司组织架构CEO → 部门主管 → 员工
报表结构层级表头、表体、表尾、字段
HTML DOM 树节点 + 元素 + 属性

六、优点与缺点总结

✅ 优点:

  • 统一接口,客户端无差别调用
  • 树结构天然适合层次建模
  • 扩展方便,添加新节点只需实现 Component

❗ 缺点:

  • 违背接口隔离原则:叶子节点和组合节点共用接口,部分函数空实现
  • 调试复杂,结构越深越难定位问题

七、与装饰器 / 责任链等模式对比

模式核心区别类似点
Composite结构树形,有聚合子对象Component 接口统一
Decorator功能增强,包裹单一对象接口一致、动态组合
Chain责任链传递,节点决定是否继续传递多节点连接,共同参与处理

八、面试回答模板

“在我们的配置中心中,使用组合模式构建配置节点树,既可以是叶子属性(字段),也可以是组合节点(嵌套组)。所有节点都继承自统一接口,使我们可以用递归统一地遍历配置结构、序列化、验证,代码简洁且扩展性好。”

✅ 建议突出树形结构、递归遍历、统一调用等优势。


九、记忆口诀

“树形结构走统一,组合调用不分离;叶子整体皆一类,层层嵌套递归易。”


十、明日预告:Day 15

享元模式(Flyweight Pattern):通过共享技术减少对象数量,提升内存利用效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

讯联桌面TV版apk下载-讯联桌面安卓电视版免费下载安装教程

在智能电视的使用过程中&#xff0c;一款好用的桌面应用能极大提升我们的使用体验。讯联桌面 TV 版就是这样一款备受关注的应用&#xff0c;它可以让安卓电视拥有更个性化、便捷的操作界面。今天&#xff0c;就为大家详细介绍讯联桌面 TV 版 apk 的免费下载安装教程。 一、下载…

Nginx知识点

Nginx发展历史 Nginx 是由俄罗斯程序员 Igor Sysoev 开发的高性能开源 Web 服务器、反向代理服务器和负载均衡器 &#xff0c;其历史如下&#xff1a; 起源与早期开发&#xff08;2002 - 2004 年&#xff09; 2002 年&#xff0c;当时 Igor Sysoev 在为俄罗斯门户网站 Rambl…

uview1.0 tabs组件放到u-popup中在微信小程序中滑块样式错乱

解决思路 重新计算布局信息&#xff1a;在弹窗显示后重新调用 init 方法来计算组件的布局信息。使用 nextTick&#xff1a;保证在视图更新之后再进行布局信息的计算。 <u-tabs ref"tabsRef" ></u-tabs> makeClick(){this.makeShowtruethis.$nextTick…

腾讯一面-软件开发实习-PC客户端开发方向

1.自我介绍就不多赘述了 2. 请介绍一下你的项目经历 - 介绍了专辑鉴赏项目&#xff0c;前端使用html语言编写&#xff0c;后端基于http协议使用C语言进行网页开发。此外&#xff0c;还提及项目中涉及处理多线程问题以及做过内存池管理项目。 3. 项目中HTTP协议是使用库实现的…

[数据可视化] Datagear使用心得:从数据整备到可视化联动实践

Datagear 是一款功能强大的数据可视化与报表工具&#xff0c;在日常数据分析与展示过程中&#xff0c;能有效帮助用户构建交互式报表与面板。本文结合实际使用场景&#xff0c;总结了在 Datagear 平台上关于元数据整备、Board 面板设计、图表嵌入等方面的使用经验&#xff0c;供…

【音视频】MP4解封装

一、概述 实现了读取mp4文件&#xff0c;提取出h264和aac文件&#xff0c;可以直接播放 二、实现过程 准备文件 在build路径下添加mp4文件 同时&#xff0c;添加main函数参数&#xff0c;表示输入文件和输出文件 打开文件 打开输入文件&#xff0c;初始化格式上下文 char…

idea2024.1双击快捷方式打不开

idea2024.1突然双击快捷方式打不开&#xff0c;使用管理员运行也打不开 在安装的idea路径下的bin目录下双击打开idea.bat文件&#xff0c;要是打不开使用txt格式打开&#xff0c;打开后在最后一行加上pause&#xff0c;之后保存。 看看报错信息是不是有一个initializedExcept…

【错误记录】Windows 命令行程序循环暂停问题分析 ( 设置 “ 命令记录 “ 选项 | 启用 “ 丢弃旧的副本 “ 选项 | 将日志重定向到文件 )

文章目录 一、报错信息二、问题分析1、Windows 命令行的缓冲区机制2、命令记录设置 三、解决方案1、设置 " 命令记录 " 选项2、将日志重定向到文件 一、报错信息 Java 程序中 , 设置 无限循环 , 每次循环 休眠 10 秒后 , 再执行程序逻辑 , 在命令行中打印日志信息 ; …

STM32H5开发陀螺仪LSM6DSV16X(1)----轮询获取陀螺仪数据

STM32H5开发陀螺仪LSM6DSV16X.1--轮询获取陀螺仪数据 概述视频教学样品申请源码下载硬件准备参考程序通信模式管脚定义IIC通信模式速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Op…

Android端使用无障碍服务实现远程、自动刷短视频

最近在做一个基于无障碍自动刷短视频的APP&#xff0c;需要支持用任意蓝牙遥控器远程控制&#xff0c; 把无障碍服务流程大致研究了一下&#xff0c;从下面3个部分做一下小结。 1、需要可调整自动上滑距离和速度以适配不同的屏幕和应用 智能适配99%机型&#xff0c;滑动参数可…

Spark和Hadoop的区别和联系

Hadoop 和 Spark 的区别 1. 架构 Hadoop&#xff1a;基于 HDFS&#xff08;分布式文件系统&#xff09;和 MapReduce&#xff08;分布式计算框架&#xff09;。HDFS 负责数据的分布式存储&#xff0c;而 MapReduce 是其主要的计算框架&#xff0c;通过 Map 和 Reduce 任务进行…

【版本控制】idea中使用git

大家好&#xff0c;我是jstart千语。接下来继续对git的内容进行讲解。也是在开发中最常使用&#xff0c;最重要的部分&#xff0c;在idea中操作git。目录在右侧哦。 如果需要git命令的详解&#xff1a; 【版本控制】git命令使用大全-CSDN博客 一、配置git 要先关闭项目&#xf…

论文阅读:2023 arxiv A Survey of Reinforcement Learning from Human Feedback

A Survey of Reinforcement Learning from Human Feedback https://arxiv.org/pdf/2312.14925 https://www.doubao.com/chat/3506943124865538 速览 这篇论文是关于“从人类反馈中进行强化学习&#xff08;RLHF&#xff09;”的综述&#xff0c;核心是讲如何让AI通过人类反…

单片机 + 图像处理芯片 + TFT彩屏 进度条控件

进度条控件使用说明 概述 本进度条控件基于单片机 RA8889/RA6809 TFT开发&#xff0c;提供了简单易用的进度显示功能。控件支持多个进度条同时显示、自定义颜色、边框和标签等特性&#xff0c;适用于需要直观显示进度信息的各类应用场景。 特性 支持多个进度条同时显示可…

数据处理: OPTICS聚类及Python实现

1. 基本原理 OPTICS&#xff08;Ordering Points To Identify the Clustering Structure&#xff09;是一种基于密度的聚类算法&#xff0c;可视为DBSCAN的改进版本。它能够识别不同密度的簇&#xff0c;并自动发现数据中的层次化聚类结构&#xff0c;适用于复杂分布的数据集…

PyCharm 在 Linux 上的完整安装与使用指南

PyCharm 在 Linux 上的完整安装与使用指南—目录 一、PyCharm 简介二、下载与安装1. 下载 PyCharm2. 安装前的依赖准备3. 安装步骤方法 1&#xff1a;通过 Snap 安装&#xff08;推荐&#xff09;方法 2&#xff1a;手动安装&#xff08;从官网下载 .tar.gz 文件&#xff09;方…

【React】路由器 React-Router

安装路由模式路由组件和属性 (Link、NavLink、Outlet、Routes、Navigate、element)路由传参 ( Hook&#xff1a;useParams 、useSearchParams )路由跳转&#xff08;Hook&#xff1a;useNavigate&#xff09;路由的构建 前端路由指的是一种将浏览器URL与特定页面或视图关联起来…

Flowable7.x学习笔记(十)分页查询已部署 BPMN XML 流程

前言 上一篇文章我们已经完成了流程的部署功能&#xff0c;那么下一步就是要激活流程了&#xff0c;但是我们要需要明确的指定具体要激活部署后的哪一条流程&#xff0c;所以我们先把已部署的基础信息以及具体定义信息分页查询出来&#xff0c;本文先把基础代码生成以及完成分页…

【论文阅读23】-地下水预测-TCN-LSTM-Attention(2024-11)

这篇论文主要围绕利用深度学习模型检测地下水位异常以识别地震前兆展开。 [1] Chen X, Yang L, Liao X, et al. Groundwater level prediction and earthquake precursor anomaly analysis based on TCN-LSTM-attention network[J]. IEEE Access, 2024, 12: 176696-176718. 期刊…

electron从安装到启动再到打包全教程

目录 介绍 安装 修改npm包配置 执行安装命令 源代码 运行 打包 先安装git, 安装打包工具 导入打包工具 执行打包命令 总结 介绍 electron确实好用,但安装是真的要耗费半条命。每次安装都会遇到各种问题,然后解决了之后。后面就不需要安装了,但有时候比如电脑重装…