设计模式-组合模式(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模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
