设计模式-组合模式(Composite)
文章目录
- 前言
- 一、组合模式的概念
- 二、组合模式的优缺点
- 1.优点
- 2.缺点
- 三、组合模式的实现
- 总结
前言
组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树状结构以表示“整体-部分”的层次结构。组合模式使得客户端可以统一处理单个对象和对象组合,而不需要区分它们。
在本篇博客中,我们将详细介绍组合模式的概念,并提供一个简单的Java代码示例来演示如何实现它。
一、组合模式的概念
组合模式的核心思想是将对象组合成树状结构,其中包含两种类型的对象:
-
叶子对象(Leaf):表示树中的叶子节点,它们没有子节点,通常是最终的操作对象。
-
组合对象(Composite):表示树中的分支节点,它们可以包含子节点,既可以是叶子对象,也可以是组合对象,形成递归结构。
组合模式的结构包括以下要素:
-
组件接口(Component):定义了叶子对象和组合对象的通用接口,通常包含一些操作方法,如添加子节点、移除子节点、获取子节点等。
-
叶子对象(Leaf):实现了组件接口,表示叶子节点,它们没有子节点。
-
组合对象(Composite):也实现了组件接口,表示分支节点,可以包含子节点,包括叶子对象和其他组合对象。
二、组合模式的优缺点
组合模式(Composite Pattern)是一种有用的设计模式,但它也有一些明显的优点和缺点。让我们首先讨论一下组合模式的优点:
1.优点
-
统一接口:组合模式允许客户端统一地处理单个对象和组合对象,因为它们共享相同的抽象接口。这使得客户端代码更加简单和一致。
-
灵活性:组合模式使得你可以很容易地添加新的叶子对象或组合对象,而不需要修改现有代码。这提高了系统的灵活性和可扩展性。
-
层次结构:组合模式适用于表示树状结构的层次关系,例如文件系统、组织结构等。它使得处理复杂的层次结构变得更加容易。
-
代码重用:由于组合模式鼓励使用相同的抽象接口,这有助于提高代码的重用性。你可以将相同的操作应用于不同的对象组合。
-
单一责任原则:组合模式有助于遵循单一责任原则,因为叶子对象和组合对象各自负责自己的任务。这有助于减少代码的耦合度。
2.缺点
-
复杂性:在一些情况下,组合模式可能会引入复杂性,特别是在处理大量对象时。递归遍历整个组合结构可能会导致性能问题。
-
不适用于所有情况:组合模式并不是在所有情况下都适用的。对于不具备树状结构的对象集合,引入组合模式可能会显得过于繁琐。
-
设计抽象度:确定何时使用组合模式以及如何划分组件和容器可以需要一些经验和抽象思维。不当的设计可能导致模式失效或不必要的复杂性。
-
限制操作:由于共享相同的接口,组合模式可能会限制某些操作的可用性,因为不同对象具有不同的能力。这需要在设计时谨慎考虑。
综上所述,组合模式是一种有助于构建树状结构的对象组合的强大模式,它具有许多优点,包括统一接口、灵活性和代码重用。然而,需要根据具体的应用场景来权衡其优点和缺点,以确保正确选择和实现该模式。在处理复杂的层次结构和对象组合时,组合模式通常是一个非常有用的设计工具。
三、组合模式的实现
让我们通过一个简单的示例来演示组合模式的实现。我们将创建一个文件系统的树状结构,其中包含文件和文件夹。
首先,我们定义组件接口 Component
:
// 组件接口
interface Component {void showInfo();
}
然后,我们创建叶子对象 File
:
// 叶子对象 - 文件
class File implements Component {private String name;public File(String name) {this.name = name;}public void showInfo() {System.out.println("File: " + name);}
}
接下来,我们创建组合对象 Folder
:
import java.util.ArrayList;
import java.util.List;// 组合对象 - 文件夹
class Folder implements Component {private String name;private List<Component> children = new ArrayList<>();public Folder(String name) {this.name = name;}public void add(Component component) {children.add(component);}public void remove(Component component) {children.remove(component);}public void showInfo() {System.out.println("Folder: " + name);for (Component component : children) {component.showInfo();}}
}
最后,我们编写客户端代码来测试组合模式:
public class CompositePatternDemo {public static void main(String[] args) {File file1 = new File("file1.txt");File file2 = new File("file2.txt");Folder folder1 = new Folder("Folder 1");folder1.add(file1);folder1.add(file2);File file3 = new File("file3.txt");Folder folder2 = new Folder("Folder 2");folder2.add(file3);Folder rootFolder = new Folder("Root");rootFolder.add(folder1);rootFolder.add(folder2);rootFolder.showInfo();}
}
在这个示例中,我们创建了文件和文件夹的树状结构,其中包含了叶子对象和组合对象。客户端可以递归地访问整个文件系统,而不需要关心对象是文件还是文件夹,体现了组合模式的统一处理特性。
总结
组合模式是一种非常有用的设计模式,特别适用于构建树状结构的对象组合。它允许你统一处理单个对象和对象组合,使得代码更加灵活和可维护。组合模式常常用于处理复杂的层次结构,如文件系统、组织结构等。但需要注意,在某些情况下,组合模式可能会引入复杂性,因此需要谨慎使用。
相关文章:
设计模式-组合模式(Composite)
文章目录 前言一、组合模式的概念二、组合模式的优缺点1.优点2.缺点 三、组合模式的实现总结 前言 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树状结构以表示“整体-部分”的层次结构。组合模式使得客户端可以统…...

架构核心技术之微服务架构
小熊学Java:https://www.javaxiaobear.cn/,文末有免费资源 本文我们来学习微服务的架构设计 主要包括如下内容。 单体系统的困难:编译部署困难、数据库连接耗尽、服务复用困难、新增业务困难。 微服务框架:Dubbo 和 Spring Clou…...

SQL Server2022版+SSMS安装教程(保姆级)
SQL Server2022版SSMS安装教程(保姆级) 一,安装SQL Server数据库 1.下载安装包 (1)百度网盘下载安装包 链接:https://pan.baidu.com/s/1A-WRVES4EGv8EVArGNF2QQ?pwd6uvs 提取码:6uvs &…...

go语言基础---8
Http请求报文格式分析 package mainimport ("fmt""net" )func main() {//监听listener, err : net.Listen("tcp", ":8000")if err ! nil {fmt.Println("listener err", err)return}defer listener.Close()//阻塞等待用户的…...
Oracle的 dblink 学习笔记
文章目录 一、基础环境二、适用场景三、过程和方法四、参考资料 版权声明:本文为CSDN博主「杨群」的原创文章,遵循 CC 4.0 BY-SA版权协议,于2023年9月10日首发于CSDN,转载请附上原文出处链接及本声明。 原文链接:http…...
任意文件上传
1.任意文件上传概述 1.1 漏洞成因 服务器配置不当,开启了PUT 方法。 Web 应用开放了文件上传功能,没有对上传的文件做足够的限制和过滤。在程序开发部署时,没有考虑以下因素,导致限制被绕过: 代码特性 组件漏洞&am…...

【Unity3D】UI Toolkit自定义元素
1 前言 UI Toolkit 支持通过继承 VisualElement 实现自定义元素,便于通过脚本控制元素。另外,UI Toolkit 也支持将一个容器及其所有子元素作为一个模板,便于通过脚本复制模板。 如果读者对 UI Toolkit 不是太了解,可以参考以下内容…...

layui手机端使用laydate时间选择器被输入法遮挡的解决方案
在HTML中,你可以使用input元素的readonly属性来禁止用户输入,但是这将完全禁用输入,而不仅仅是禁止弹出输入法。如果你想允许用户在特定条件下输入,你可以使用JavaScript来动态地切换readonly属性。 readonly属性 增加readonly属…...
MVSNet CVPR-2018 学习总结笔记 译文 深度学习三维重建
文章目录 2 MVSNet CVPR-20182.0 主要特点2.1 过程2.2 MVSNet主要贡献2.3 论文简介2.3.1 深度特征提取2.3.2 构造匹配代价2.3.3 代价累计2.3.4 深度估计2.3.5 深度图优化2.4 MVSNet(pytorch版本)2 MVSNet CVPR-2018 MVSNet (pytorch版) 代码注释版 下载 (注释非常详细,代码…...

Kafka/Spark-01消费topic到写出到topic
1 Kafka的工具类 1.1 从kafka消费数据的方法 消费者代码 def getKafkaDStream(ssc : StreamingContext , topic: String , groupId:String ) {consumerConfigs.put(ConsumerConfig.GROUP_ID_CONFIG , groupId)val kafkaDStream: InputDStream[ConsumerRecord[String, Strin…...

【算法与数据结构】98、LeetCode验证二叉搜索树
文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:注意不要落入下面你的陷阱,笔者本来想左节点键值<中间节点键值<右节点键值即可&…...

关于GitHub Desktop中的“Open in Git Bash”无法使用的问题
问题描述 在GitHub Desktop中选择Repository--Open in Git Bash(如图1),出现如图2所示结果。 图1 图2 解决办法(Windows10) 这个问题是由于Git的环境变量没有得到正确配置所导致的,所以需要正确设置环境变量…...

使用DeepSpeed加速大型模型训练(二)
使用DeepSpeed加速大型模型训练 在这篇文章中,我们将了解如何利用Accelerate库来训练大型模型,从而使用户能够利用DeeSpeed的 ZeRO 功能。 简介 尝试训练大型模型时是否厌倦了内存不足 (OOM) 错误?我们已经为您提供了保障。大型模型性能非…...
ASP.net web应用 GridView控件常用方法
GridView 控件是 ASP.NET Web Forms 中常用的数据展示控件之一。它提供了一个网格形式的表格,用于显示和编辑数据。GridView 控件对于包含大量数据、需要进行分页、排序和筛选的情况非常有用。 GridView 控件的主要特性包括: 数据绑定:GridV…...
MATLAB入门一基础知识
MATLAB入门一基础知识 此篇为课程学习笔记 链接: link 什么是MATLAB 平时所说的MATLAB既是一款软件又是一种编程语言,只是这种高级解释性语言是在配套的软件下进行开发的 MATLAB的一个特性 MATLAB的一个特性,如果一条语句以英文分号‘;’结尾&…...
SpringMVC实现文件上传和下载功能
文件下载 ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文。具体步骤如下: 获取下载文件的位置;创建流,读取文件;设置响应信息,包括响应头,响应体以…...

CHS零壹视频恢复程序OCR使用方法
目前CHS零壹视频恢复程序监控版、专业版、高级版已经支持了OCR,OCR是一种光学识别系统,通俗说就和扫描仪带的OCR软件一样的原理: 分析照片->OCR获取字符串->整理字符串->输出 使用方法如下(以CHS零壹视频恢复程序监控版…...

云备份——服务端客户端联合测试
一,准备工作 服务端清空备份文件信息、备份文件夹、压缩文件夹 客户端清空备份文件夹 二,开始测试 服务端配置文件 先启动服务端和客户端 向客户端指定文件夹放入稍微大点的文件,方便后续测试断点重传 2.1 上传功能测试 客户端自动上传成功…...

L2 数据仓库和Hive环境配置
1.数据仓库架构 数据仓库DW主要是一个用于存储,分析,报告的数据系统。数据仓库的目的是面向分析的集成化数据环境,分析结果为企业提供决策支持。-DW不产生和消耗数据 结构数据:数据库中数据,CSV文件 直接导入DW非结构…...

【iOS】MVC
文章目录 前言一、MVC各层职责1.1、controller层1.2、model层1.3、view层 二、总结三、优缺点3.1、优点3.2、缺点 四、代码示例 前言 MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...

相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...

leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...