设计模式|组合模式(Composite Pattern)

文章目录

  • 什么是组合模式?
  • 主要角色
  • 举例
    • 组织关系树
    • 操作系统的文件夹与文件
  • 代码示例:文件系统
  • 优缺点
    • 优点
    • 缺点
  • 组合模式VS递归

什么是组合模式?

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示部分-整体的层次结构。这种模式使得客户端能够以统一的方式处理单个对象和组合对象。

主要角色

  • 组件(Component):定义了组合中对象的通用接口,可以是抽象类或接口。该接口通常包含对子节点的管理操作,比如添加子节点、删除子节点等。
  • 叶子(Leaf):表示组合中的叶子节点对象,叶子节点没有子节点。
  • 组合(Composite):表示组合中的容器节点对象,组合节点可以包含其他组件,即子节点。组合节点通常实现了组件接口中的操作,并且可以递归地调用子节点的操作。

举例

组织关系树

公司组织关系可能分为部门与人,其中人属于部门,有的人有下属,有的人没有下属。如果我们统一将部门、人抽象为组织节点,就可以方便的统计某个部门下有多少人、财务数据等等,而不用关心当前节点是部门还是人。

操作系统的文件夹与文件

操作系统的文件夹与文件也是典型的树状结构,为了方便递归出文件夹内文件数量或者文件总大小,我们最好设计的时候就将文件夹与文件抽象为文件,这样每个节点都拥有相同的方法添加、删除、查找子元素,而不需要关心当前节点是文件夹或是文件。

代码示例:文件系统

考虑一个文件系统的例子,其中文件和文件夹是节点,文件夹可以包含其他文件夹或文件。这是组合模式的一个典型应用场景。

import java.util.ArrayList;
import java.util.List;// 组件接口
interface FileSystemComponent {String getName();int getSize();
}// 文件类(叶子节点)
class File implements FileSystemComponent {private String name;priva

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

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

相关文章

高仿小米商城用户端

高仿小米商城用户端(分为商城前端(tongyimall-vue)和商城后端(tongyimall-api)两部分),是Vue SpringBoot的前后端分离项目,用户端包括首页门户、商品分类、首页轮播、商品展示、商品推荐、购物车、地址管理、下订单、扫码支付等功能模块。 …

AndroidStudio 导出aar包,并使用

打包 1、确认当前选项是否勾选,如未勾选请先勾选。 2、勾选完成后重启Android Studio。 3、重启完成后,选中要打包的module 4、打包完成 使用 1.在项目中新建libs,放入aar文件。 2.修改配置 添加如下代码 flatDir {dirs("libs")}3.修改app…

档案集中管理的痛点怎么解决?

档案集中管理可能面临的痛点包括以下几个方面: 1. 档案分类和整理困难:档案集中管理会面临大量档案的分类和整理工作,可能导致混乱和困难。 解决方法: - 建立统一的档案分类规范和流程,确保所有档案都能按照规定的方式…

PMP报考别跟风!搞懂这些问题不踩坑!

1.PMP是什么? 1.PMP(Project ManagementProfessional)的中文全称是项目管理专业人士资格认证。该认证是由美国项目管理协会PMI在全球206个国家发起的针对项目经理的资格认证。 2.PMP认证是目前国际上项目管理领域认可度和含金量最高的证书。通过PMP就证明你的项目…

性能测试--数据库慢 SQL 语句分析

一 慢 SQL 语句的几种常见诱因 1. 无索引或索引失效 ​ 当查询基于一个没有索引的列进行过滤、排序或连接时,数据库可能被迫进行全表扫描,即逐行检查所有数据,导致性能显著下降。 ​ 虽然我们很多时候建立了索引,但在一些特定的…

Java学习笔记零基础入门1

目录 第一章 Java概述 1.1 什么是程序 1.2 Java 技术体系平台 1.3 Java 重要特点 1.4 Java 的开发工具 4.1 工具选择 1.5 Java 运行机制及运行过程 5.1 Java 语言的特点:跨平台性 5.2 Java 核心机制-Java 虚拟机 [JVMjavavirtual machine] 1.6 什么是JDK&…

掌握Node Version Manager(nvm):跨平台Node.js版本管理

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

人工智能培训老师大模型老师叶梓:LoRA技术的应用与实践

在深度学习领域,大型语言模型(LLMs)的微调是一个重要的研究方向,旨在将预训练的模型调整到特定任务上。然而,由于模型参数众多,这一过程往往需要大量的计算资源和内存。幸运的是,一种名为低秩适…

男人的梦想:使用 Python Turtle 绘制豪华汽车 Logo

目录: 宝马汽车 Logo奔驰汽车 Logo奥迪汽车 Logo特斯拉汽车 Logo 以下代码中,将向你展示多个使用 Python Turtle 中绘制的豪华汽车 Logo,包括奔驰、宝马、奥迪、特斯拉的汽车 Logo。 宝马汽车 Logo import turtle as pen pen.setpos(0,-250) …

SpringBoot版本配置问题与端口占用

前言 ​ 今天在配置springboot项目时遇到了一些问题,jdk版本与springboot版本不一致,在使用idea的脚手架创建项目时,idea的下载地址是spring的官方网站,这导致所下载的版本都是比较高的,而我们使用最多的jdk版本是jdk…

基础矩阵和本质矩阵

基础矩阵(Fundamental Matrix)和本质矩阵(Essential Matrix)是计算机视觉和立体视觉中极为重要的几何概念,它们分别描述了两个不同视点(通常是双目相机或连续拍摄的两张图像)下的点对之间的几何…

【WebSocket连接异常】前端使用WebSocket子协议传递token时,Java后端的正确打开方式!!!

文章目录 1. 背景2. 代码实现和异常发现3. 解决异常3.1 从 URL入手3.2 从 WebSocket子协议的使用方式入手(真正原因) 4. 总结(仍然存在的问题) 前言: 本篇文章记录的是使用WebSocket进行双向通信时踩过的坑&#xff0c…

基础拓扑学习

基础拓扑 有限集、可数集和不可数集 2.1 定义 考虑两个集 A A A和 B B B,他们的元素可以是任何东西。假定对于 A A A的每个元素 x x x,按照某种方式,与集 B B B的一个元素联系着,这个元素记作 f ( x ) f\left( x \right) f(x);那…

python学习笔记B-07:序列结构之列表--列表的常用函数和方法

以xx_函数名(列表名)的形式出现的是函数;以xx_列表名.xx_方法名的形式出现的是方法。 列表常用函数如下: len():计算列表元素数量 max():获取列表元素最大值 min():获取列表元素最小值 sum():计算列表中各元素之和 列表常用方法如…

windows下安装kibana

下载:https://www.elastic.co/cn/downloads/kibana 安装:https://www.elastic.co/guide/cn/kibana/current/install.html 安装好后,cd到kibana的bin目录,启动kibana.bat 然后访问localhost:5601

42.AQS

1.AQS, AbstractQueuedSynchronizer,是阻塞式锁和相关同步器工具的框架。 2.阻塞式的锁就类似于Synchronized锁。 3.用state属性表示资源的状态:独占模式,共享模式。子类需要定义如何维护这个状态,控制如何获取锁和释放锁。 4.独占模式&am…

LeetCode450:删除二叉搜索树中的节点

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤&#xf…

链表(C语言)

前言:前面几篇文章我们详细介绍了顺序表,以及基于顺序表来实现的通讯录。今天我们连介绍一下链表的下一个结构链表。那么链表和顺序表究竟有什么区别呢?他们两个的优缺点分别是什么。今天这篇文章就带大家了解一下链表。 目录 一.链表的概念…

R语言处理RNA等位基因不平衡(二)

1.前言: RNA测序技术允许研究人员在转录组水平上精细地检测基因表达,包括等位基因特异性表达的变异。通过比较来自同一基因的不同等位基因的表达量,可以揭示细胞内遗传和表观遗传调控机制的差异。本代码通过对RNA测序数据中的读数计数进行详…

瑞芯微RK3328(ROC-RK3328-PC)buildroot 开发QT的hello world

第一部分:编译rk3328 sdk 0. 环境 - EC-R3328PC(ROC-RK3328-PC) - ubuntu18(100GB) 1. 安装依赖 sudo apt-get updatesudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-boot-tools devi…