设计模式-结构型-组合模式
1. 什么是组合模式?
组合模式(Composite Pattern) 是一种结构型设计模式,它允许将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。换句话说,组合模式允许你将多个对象组合成一个复合对象,然后统一处理这些对象。
核心思想
组合模式通过将简单对象(叶子节点)和复合对象(包含子对象的树形结构)统一视为相同的类型,从而简化客户端对不同类型对象的处理。它常用于表示树形结构,如目录结构、组织架构等。
2. 组合模式的结构
UML 类图
以下是组合模式的 UML 类图:
角色
-
Component(抽象组件)
定义了所有对象(无论是叶子节点还是组合节点)共用的方法,如operation()
。可以是抽象类或接口。 -
Leaf(叶子节点)
叶子节点是组合树结构的最底层元素,不能再包含子对象。它实现了operation()
方法,通常用于具体的操作。 -
Composite(组合节点)
组合节点包含叶子节点或其他组合节点。它也实现了operation()
方法,并允许对子节点进行操作(如add()
、remove()
等)。通常用来组织和管理子组件。
3. 组合模式的示例
场景描述
假设我们需要构建一个文件系统的树形结构,其中包含文件夹(可以包含文件和子文件夹)和文件。文件和文件夹都有一个 display()
方法。组合模式可以帮助我们统一处理文件和文件夹。
代码实现
from abc import ABC, abstractmethod# 抽象组件类
class FileSystemComponent(ABC):@abstractmethoddef display(self):pass# 叶子节点:文件类
class File(FileSystemComponent):def __init__(self, name):self.name = namedef display(self):print(f"File: {self.name}")# 组合节点:文件夹类
class Folder(FileSystemComponent):def __init__(self, name):self.name = nameself.children = []def add(self, component: FileSystemComponent):self.children.append(component)def remove(self, component: FileSystemComponent):self.children.remove(component)def display(self):print(f"Folder: {self.name}")for child in self.children:child.display()# 测试组合模式
if __name__ == "__main__":# 创建文件和文件夹file1 = File("file1.txt")file2 = File("file2.txt")file3 = File("file3.txt")folder1 = Folder("Folder1")folder2 = Folder("Folder2")folder1.add(file1)folder1.add(file2)folder2.add(file3)# 创建根文件夹,添加子文件夹root = Folder("Root")root.add(folder1)root.add(folder2)# 显示整个文件系统结构root.display()
输出
Folder: Root
Folder: Folder1
File: file1.txt
File: file2.txt
Folder: Folder2
File: file3.txt
在上面的代码中,FileSystemComponent
是抽象组件类,File
是叶子节点,Folder
是组合节点。Folder
具有 add()
和 remove()
方法来管理其子节点,而 File
只有 display()
方法。最后,通过调用根文件夹的 display()
方法,能够递归地显示整个文件系统的结构。
4. 组合模式的优缺点
优点
-
简化客户端代码
客户端不需要关心对象是单个对象还是组合对象,它们可以通过相同的接口进行处理,简化了代码结构。 -
递归结构清晰
组合模式特别适合处理递归结构的数据,比如文件系统、组织结构等。 -
增加或删除元素方便
通过组合模式,添加或删除树形结构中的节点(文件或文件夹)非常方便,不影响其它节点的操作。 -
高扩展性
可以轻松扩展新的叶子节点或组合节点,而不需要修改现有的客户端代码。
缺点
-
复杂性增加
如果对象结构本身并不复杂,引入组合模式可能会让系统变得过于复杂,导致不必要的开销。 -
不易实现对叶子节点的具体行为
在某些情况下,叶子节点的行为可能与组合节点有所不同,这可能会导致设计上的矛盾,难以通过统一接口来处理。
5. 组合模式的应用场景
-
文件系统
文件夹可以包含子文件夹和文件,文件和文件夹是不同的对象类型,但是它们都实现了一个公共接口display()
,可以统一处理。 -
GUI 组件库
许多图形用户界面组件(如按钮、窗体、标签等)可以通过组合模式来处理。组件(如按钮)可以是叶子节点,而容器(如面板、窗体)可以是组合节点。 -
组织架构
企业的组织架构可以通过组合模式表示。一个部门可以包含多个员工或者子部门,所有部门和员工都可以通过统一的接口进行管理。 -
树形结构的表示
任何需要树形结构表示的场景,例如目录树、家族谱、层次化数据展示等,都适合使用组合模式。
6. 总结
组合模式 是一种非常强大的结构型设计模式,它能够有效地处理树形结构的数据,同时使得客户端代码对单一对象和组合对象的处理保持一致性。通过组合模式,您可以更轻松地管理复杂的对象结构,并且增加或删除节点时不会影响到其他部分。
核心要点:
- 统一对待单一对象与组合对象。
- 递归结构使得复杂对象的管理变得简单。
- 组合模式简化客户端代码,使其更加灵活。
相关文章:
![](https://i-blog.csdnimg.cn/direct/c87b0c0f60b049f09a0ebd5918f0cd2f.webp)
设计模式-结构型-组合模式
1. 什么是组合模式? 组合模式(Composite Pattern) 是一种结构型设计模式,它允许将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。换句话说,组合模式允…...
![](https://i-blog.csdnimg.cn/direct/ca29c9bb8047414fb7180f070aefd9ce.png)
基于Java的推箱子游戏设计与实现
基于Java的推箱子游戏设计与实现 摘 要 社会在进步,人们生活质量也在日益提高。高强度的压力也接踵而来。社会中急需出现新的有效方式来缓解人们的压力。此次设计符合了社会需求,Java推箱子游戏可以让人们在闲暇之余,体验游戏的乐趣。具有…...
![](https://www.ngui.cc/images/no-images.jpg)
Spark vs Flink分布式数据处理框架的全面对比与应用场景解析
1. 引言 1.1 什么是分布式数据处理框架 随着数据量的快速增长,传统的单机处理方式已经无法满足现代数据处理需求。分布式数据处理框架应运而生,它通过将数据分片分布到多台服务器上并行处理,提高了任务的处理速度和效率。 分布式数据处理框…...
![](https://www.ngui.cc/images/no-images.jpg)
python_excel列表单元格字符合并、填充、复制操作
读取指定sheet页,根据规则合并指定列,填充特定字符,删除多余的列,每行复制四次,最后写入新的文件中。 import pandas as pd""" 读取指定sheet页,根据规则合并指定列,填充特定字…...
![](https://i-blog.csdnimg.cn/direct/1ad7d212b9764ee08608d4cf2336fd6e.png)
nums[:]数组切片
问题:给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 使用代码如下没有办法通过测试示例,必须将最后一行代码改成 nums[:]nums[-k:]nums[:-k]切片形式: 原因:列表的切片操作 …...
![](https://www.ngui.cc/images/no-images.jpg)
【Arthas 】Can not find Arthas under local: /root/.arthas/lib 解决办法
报错 [INFO] JAVA_HOME: /opt/java/openjdk [INFO] arthas-boot version: 4.0.4 [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. [1]: 12 org.springframework.boot.loader.JarLauncher 1 [ER…...
![](https://i-blog.csdnimg.cn/img_convert/72ff466fe95017d6a18f5600f8e332e1.png)
录用率23%!CCF推荐-B类,Early Access即可被SCI数据库收录,中美作者占比过半
International Journal of Human-Computer Interaction(IJHCI)创刊于1989年,由泰勒-弗朗西斯(Taylor & Francis, Inc.)出版,主要发表关于交互式计算(认知和人体工程学)、数字无障…...
![](https://i-blog.csdnimg.cn/direct/58ab61b43a4f4a33a735637ba1ff76ad.png)
IP 地址与蜜罐技术
基于IP的地址的蜜罐技术是一种主动防御策略,它能够通过在网络上布置的一些看似正常没问题的IP地址来吸引恶意者的注意,将恶意者引导到预先布置好的伪装的目标之中。 如何实现蜜罐技术 当恶意攻击者在网络中四处扫描,寻找可入侵的目标时&…...
![](https://i-blog.csdnimg.cn/direct/8506994f799d4779a114891130bce496.png)
Vue_API文档
Vue API风格 Vue 的组件可以按两种不同的风格书写:选项式 API(Vue2) 和组合式 API(Vue3) 大部分的核心概念在这两种风格之间都是通用的。熟悉了一种风格以后,你也能够很快地理解另一种风格 选项式API(Opt…...
![](https://www.ngui.cc/images/no-images.jpg)
WebSocket 设计思路
WebSocket 设计思路 1. 核心结构体 1.1 Manager (管理器) // Manager 负责管理所有WebSocket连接 type Manager struct {clients sync.Map // 存储所有客户端连接broadcast chan []byte // 广播消息通道messages chan Message // 消息处理通道config *config.WebSo…...
![](https://www.ngui.cc/images/no-images.jpg)
Jenkins持续集成与交付安装配置
Jenkins 是一款开源的持续集成(CI)和持续交付(CD)工具,它主要用于自动化软件的构建、测试和部署流程。为项目持续集成与交付功能强大的应用。下面我们来介绍下它的安装与配置。 环境准备 更新系统组件(这…...
![](https://i-blog.csdnimg.cn/direct/8eae0b8b4a25444e85ceea559a7cde0f.png)
ESP32作为Wi-Fi AP模式的测试
一、AP模式的流程 初始化阶段 (Init Phase): 1.1: Main task(主任务)初始化LwIP(轻量级TCP/IP协议栈)。 ESP_ERROR_CHECK(esp_netif_init()); 1.2: 创建和初始化Event task(事件任务)。 ESP_ERROR_CHECK…...
![](https://i-blog.csdnimg.cn/direct/eaf63b8a74904fc4ad48dc336c31979d.png)
【爬虫】单个网站链接爬取文献数据:标题、摘要、作者等信息
源码链接: https://github.com/Niceeggplant/Single—Site-Crawler.git 一、项目概述 从指定网页中提取文章关键信息的工具。通过输入文章的 URL,程序将自动抓取网页内容 二、技术选型与原理 requests 库:这是 Python 中用于发送 HTTP 请求…...
![](https://www.ngui.cc/images/no-images.jpg)
Android RIL(Radio Interface Layer)全面概述和知识要点(3万字长文)
在Android面试时,懂得越多越深android framework的知识,越为自己加分。 目录 第一章:RIL 概述 1.1 RIL 的定义与作用 1.2 RIL 的发展历程 1.3 RIL 与 Android 系统的关系 第二章:RIL 的架构与工作原理 2.1 RIL 的架构组成 2.2 RIL 的工作原理 2.3 RIL 的接口与协议…...
![](https://i-blog.csdnimg.cn/direct/6a996f264eeb4d7fbece035eeab681d4.png)
leetcode_2816. 翻倍以链表形式表示的数字
2816. 翻倍以链表形式表示的数字 - 力扣(LeetCode) 搜先看到这个题目 链表的节点那么多 已经远超longlong能够表示的范围 那么暴力解题 肯定是不可以的了 我们可以想到 乘法运算中 就是从低位到高位进行计算 刚开始 我想先反转链表 然后在计算 然后在进…...
![](https://i-blog.csdnimg.cn/img_convert/6a2bd4eca7e04cea831bd4bfe8ef0eeb.png)
【论文阅读】MAMBA系列学习
Mamba code:state-spaces/mamba: Mamba SSM architecture paper:https://arxiv.org/abs/2312.00752 背景 研究问题:如何在保持线性时间复杂度的同时,提升序列建模的性能,特别是在处理长序列和密集数据(如…...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL教程之:批量使用mysql
在前几节中,您以交互方式使用mysql输入语句并查看结果。您也可以运行mysql批量模式。为此,请将要运行的语句放在文件中,然后告诉mysql从文件中读取其输入: $> mysql < batch-file 如果您在Windows下运行mysql,…...
![](https://www.ngui.cc/images/no-images.jpg)
17_Redis管道技术
Redis管道(Pipeline)技术是一种在 Redis 客户端与服务器之间进行高效数据交互的技术。 1.Redis管道技术介绍 1.1 传统请求响应模式 在传统的请求-响应模式下,客户端每发送一个命令后会等待服务器返回结果,然后再发送下一个命令。这种方式在网络延迟较高的情况下会导致性…...
![](https://www.ngui.cc/images/no-images.jpg)
【LC】3270. 求出数字答案
题目描述: 给你三个 正 整数 num1 ,num2 和 num3 。 数字 num1 ,num2 和 num3 的数字答案 key 是一个四位数,定义如下: 一开始,如果有数字 少于 四位数,给它补 前导 0 。答案 key 的第 i 个数…...
![](https://www.ngui.cc/images/no-images.jpg)
【redis】ubuntu18安装redis7
在Ubuntu 18下安装Redis7可以通过以下两种方法实现:手动编译安装和使用APT进行安装。 Ubuntu 18系统的环境和版本: $ cat /proc/version Linux version 4.15.0-213-generic (builddlcy02-amd64-079) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)…...
![](https://www.ngui.cc/images/no-images.jpg)
d2j-dex2jar classes.dex 执行报错:not support version 问题解决
这个错误是由于 dex2jar 工具不支持你的 classes.dex 文件的版本导致的。通常情况下,这是因为你尝试使用的 dex2jar 版本不支持 Android 较新的 DEX 文件格式(例如 DEX 格式 038 或更新版本)。 解决方法 以下是一些解决此问题的步骤&#x…...
![](https://i-blog.csdnimg.cn/img_convert/962e97addbd1d8563ca6e3077509dc00.png)
智慧城市应急指挥中心系统平台建设方案
建设背景与目标 智慧城市应急指挥中心系统平台的建设,源于对城市管理精细化、智能化的迫切需求。平台旨在通过整合各方资源,实现应急事件的快速响应与高效处置,提升城市安全管理水平。 前端设计与信息采集 前端设计注重立体化、全方位信息…...
![](https://www.ngui.cc/images/no-images.jpg)
QT鼠标、键盘事件
一、鼠标 鼠标点击 mousePressEvent 鼠标释放 mouseReleaseEvent 鼠标移动 mouseMoveEvent 鼠标双击 mouseDoubleClickEvent 鼠标滚轮 QWheelEvent 二、键盘 键盘按下 keyPressEvent 键盘松开keyReleaseEvent 一、鼠标 #include <QMouseEvent> 鼠标点击 mouse…...
![](https://i-blog.csdnimg.cn/direct/6f924e23828a4c36bb819ae7f7db55c1.png)
Ceph分布式存储集群,不仅仅是一个简单的对象存储解决方案
Ceph 作为 OpenStack 的存储后端 块存储(Cinder 后端) Ceph 的 RBD(RADOS Block Device)模块作为 OpenStack Cinder 服务的后端,为虚拟机提供块级别的存储资源。RBD 支持快照、克隆和恢复等功能,能够满足虚…...
![](https://i-blog.csdnimg.cn/direct/6adf3cad0b404d3c94caefd10b99671c.gif#pic_center)
DSP+Simulink——点亮LED灯(TMSDSP28379D)超详细
实现功能:DSP28379D-LED灯闪烁 :matlab为2019a :环境建立见之前文章 Matlab2019a安装C2000 Processors超详细过程 matlab官网链接: Getting Started with Embedded Coder Support Package for Texas Instruments C2000 Processors Overview of Creat…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux 环境下编译安装 OpenCV 4.8.x
在 Linux 环境下编译安装 OpenCV 4.8.x 需要安装一系列依赖库。以下是详细的步骤说明,并附上每个依赖库的作用解释。 1. 环境准备 操作系统 推荐使用 Ubuntu 20.04/22.04 或其他基于 Debian 的 Linux 发行版。 编译器 GCC 9 或更高版本(默认已安装&a…...
![](https://i-blog.csdnimg.cn/direct/36d911bfe7dc4e758b52a0f03ce57840.png#pic_center)
phpenc加密程序源码
免费扩展加密程序,类似于sg11加密,支持单个PHP(免费)文件以及批量PHP文件(ZIP压缩包格式)源码加密的保护平台,加密后的源码文件保持原有代码结构,可以跨平台运行,可以运行…...
![](https://www.ngui.cc/images/no-images.jpg)
学英语学Elasticsearch:04 Elastic integrations 工具箱实现对第三方数据源的采集、存储、可视化,开箱即用
📢📢📢: 先看关键单词,再看英文,最后看中文总结,再回头看一遍英文原文,效果更佳!! 关键词 ingestion 摄取 /ɪnˈdʒɛstʃən/ observability 可观察性 …...
![](https://www.ngui.cc/images/no-images.jpg)
2024.10.12 校招 实习 内推 面经
🛰️ :neituijunsir 交* 流*裙 ,内推/实习/校招汇总表格 1、校招 | 中车电动2025届校园招聘正式启动 校招 | 中车电动2025届校园招聘正式启动 2、校招 | 莱斯信息2025届校园招聘 校招 | 莱斯信息2025届校园招聘 3、招聘 | 中电熊猫2025…...
![](https://www.ngui.cc/images/no-images.jpg)
ios越狱脚本巨魔商店安装教程
使用爱思助手安装 安装爱思助手:在电脑上安装 iTunes 和爱思助手,并使用 Apple ID 登录2。 IPA 签名:打开爱思助手,选择工具箱中的 IPA 签名。点击添加 IPA 文件,选择下载的 TrollInstallerX.ipa 文件。选择使用 Apple…...
![](/images/no-images.jpg)
二手房网站平台怎么做/品牌关键词优化哪家便宜
本文参考自《剑指offer》一书,代码采用Java语言。题目输入两个链表,找出它们的第一个公共结点。思路蛮力法:遍历第一个链表的结点,每到一个结点,就在第二个链表上遍历每个结点,判断是否相等。时间复杂度为O…...
![](/images/no-images.jpg)
有了域名 怎么做网站/抖音关键词优化排名
java中String是对象类型,不能使用""比较。正确的用法如下: if(A.equals(B)){//相等 }...
![](/images/no-images.jpg)
自助建站 源码/seo初学教程
关于network partition网络设备故障导致的网络分裂。比如,存在A\B\C\D\E五个节点,A\B处于同一子网,B\C\D处于另外一子网,中间通过交换机相连。若两个子网间的交换机故障了即发生了网络分区,A\B和C\D\E便不能通讯。某些…...
![](/images/no-images.jpg)
阜蒙县建设学校网站是什么/石家庄网站建设排名
http://www.lydsy.com/JudgeOnline/problem.php?id3319 题意:给一棵n节点的树(n<1e6),m个操作(m<1e6),每次操作有两种:1、查询u到根的第一条黑边的编号。2、将u到v的路径全部…...
![](http://hi.csdn.net/attachment/201110/3/0_13176122874yYW.gif)
真人做爰直播全集播放网站/企业网站推广策划
Linux设备驱动工程师之路——触摸屏驱动s3c2410_ts.c分析 K-Style 转载请自 http://blog.csdn.net/ayangke 一、触摸屏硬件知识 1.模块原理图 S3C2440有8路的ADC通道其中触摸屏控制器接口XP,XM,YP,YM与四路ADC通道复用四个IO引脚。从原理图看出8路ADC只有一个A/D转换器&am…...
![](https://img-blog.csdnimg.cn/eed2617b35d74492834e95f237b29b7b.png)
平湖市建设局网站/网站百度收录批量查询
具体详细可参考该篇博文:七、加载数据集 ①准备数据集 以泰坦尼克号数据集(titanic.csv)为例 下载完解压,将解压后得到的压缩包放到指定的路径下,我这边放到了我的jupyter里面了 里面有一些文本信息,仅使用数字信息ÿ…...