编程-设计模式 8:组合模式
设计模式 8:组合模式
定义与目的
- 定义:组合模式又称为部分-整体模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
- 目的:该模式的主要目的是将多个对象组织成树形结构以表示“部分-整体”的层次结构,并且能够一致地处理单个对象和组合对象。
实现示例
假设我们需要构建一个文件系统,其中包含文件夹和文件。我们可以使用组合模式来实现这个需求。
// 抽象组件 - 文件系统节点
abstract class FileSystemNode {protected String name;public FileSystemNode(String name) {this.name = name;}public abstract void add(FileSystemNode node);public abstract void remove(FileSystemNode node);public abstract void display(int depth);
}// 叶子组件 - 文件
class File extends FileSystemNode {public File(String name) {super(name);}@Overridepublic void add(FileSystemNode node) {throw new UnsupportedOperationException("Cannot add to a file.");}@Overridepublic void remove(FileSystemNode node) {throw new UnsupportedOperationException("Cannot remove from a file.");}@Overridepublic void display(int depth) {printDepth(depth);System.out.println("File: " + name);}private void printDepth(int depth) {for (int i = 0; i < depth; i++) {System.out.print(" ");}}
}// 复合组件 - 文件夹
class Directory extends FileSystemNode {private List<FileSystemNode> children = new ArrayList<>();public Directory(String name) {super(name);}@Overridepublic void add(FileSystemNode node) {children.add(node);}@Overridepublic void remove(FileSystemNode node) {children.remove(node);}@Overridepublic void display(int depth) {printDepth(depth);System.out.println("Directory: " + name);for (FileSystemNode child : children) {child.display(depth + 1);}}private void printDepth(int depth) {for (int i = 0; i < depth; i++) {System.out.print(" ");}}
}// 客户端代码
public class Client {public static void main(String[] args) {Directory root = new Directory("root");Directory documents = new Directory("documents");Directory pictures = new Directory("pictures");File report = new File("report.txt");File photo = new File("photo.jpg");documents.add(report);pictures.add(photo);root.add(documents);root.add(pictures);root.display(0);}
}
使用场景
- 当你需要表示对象的分层结构时。
- 当你想保持一致的接口,无论是处理单个对象还是处理对象组时。
- 当你需要动态地在组合中添加和移除对象时。
组合模式通过将对象组织成树形结构,使得你可以使用相同的接口来操作单个对象或对象的组合。这对于需要管理复杂的层次结构的对象非常有用。
小结
组合模式是一种常用的结构型模式,它可以帮助你构建复杂的树形结构,并且让你能够以一致的方式处理单个对象和对象的集合。这对于需要表示具有层级关系的对象是非常有用的。
相关文章:
编程-设计模式 8:组合模式
设计模式 8:组合模式 定义与目的 定义:组合模式又称为部分-整体模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。目的:该模式的主要目的是将多个对象…...
c语言指针(8.11)
那这样p和*p记录的地址不一样了吗? 不,p 和 *p 记录的地址在某种意义上是“相同”的,但它们在类型和使用方式上有所不同。 p 的地址:p 是一个指针,它本身存储了一个地址,这个地址是二维数组 arr 的第一行&a…...
加密技术的发展
加密是一种用于保护数据安全的技术,通过将原始信息(明文)转换为一种不可读的形式(密文),确保只有拥有正确解密密钥的人才能访问其真实内容。加密技术在现代社会中被广泛应用于各种场景,包括但不…...
编程-设计模式 22:策略模式
设计模式 22:策略模式 定义与目的 定义:策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。目的:该模式的主要目的是将一组相关的算法封装成一系列可…...
kafka 将log4j的项目升级到log4j2
kafka版本是kafka_2.11-2.0.0,由于引用的log4j有漏洞,而升级kafka可能影响比较大,所以更新log4j包的版本。 参考的是将log4j的项目升级到log4j2 主要步骤如下: cd kafka的目录 cd libs rm -f slf4j-log4j12-1.7.25.jar rm -f …...
【CSP2019 模拟赛】Time
题目描述: 小 A 现在有一个长度为 𝑛 的序列 {𝑥𝑖},但是小 A 认为这个序列不够优美。 小 A 认为一个序列是优美的,当且仅当存在 𝑘 ∈ [1, 𝑛],满足: &#…...
二叉树相关的算法题
二叉树相关的算法题 单值二叉树 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。 示例 1: 输入:[1,1,1,1,1,null,1] 输出:t…...
Unity URP 曲面细分学习笔记
学百人时遇到了曲面着色器的内容,有点糊里糊涂,于是上知乎找到了两篇大佬的文章 Unity URP 曲面细分 和 Unity曲面细分笔记,本文只是自己做学习记录使用 1.曲面细分与镶嵌 曲面细分或细分曲面(Subdivision surface)是…...
每天五分钟深度学习pytorch:训练神经网络模型的基本步骤
本文重点 本文个人认为是本专栏最重要的章节内容之一,前面我们学习了pytorch中的基本数据tensor,后面我们就将学学习深度学习模型的内容了,在学习之前,我们先来看一下我们使用pytorch框架训练神经网络模型的基本步骤,然后我们下面就将这些步骤分解开来,详细学习。 代码…...
【langchain学习】使用缓存优化langchain中的LLM调用性能:内存、SQLite与Redis的对比
在处理语言模型(LLM)调用时,特别是在需要多次执行相同请求的情况下,缓存机制能够显著提升系统的性能。本文通过对比内存缓存(InMemoryCache)、SQLite缓存(SQLiteCache)和Redis缓存(RedisCache),探讨了如何在Langchain中使用这些缓存机制来优化LLM调用的性能。 代码…...
spring boot 集成EasyExcel
EasyExcel 是一个基于 Java 的快速、简洁的 Excel 处理工具,它能够在不用考虑性能和内存等因素的情况下,快速完成 Excel 的读写功能。 首先,需要在 Spring Boot 项目中引入 EasyExcel 依赖。在 pom.xml 文件中添加以下依赖: <d…...
获取对象中第一个存在的值
在JavaScript中,要从一个对象中获取第一个存在的(非undefined、非null、非空数组等)值,你可以使用Object.values()方法结合Array.prototype.find()方法。以下是一个示例代码,演示如何实现这一点: const ob…...
Python学习笔记----集合与字典
1. 字符串、列表和元组的元素都是按下标顺序排列,可通过下 标直接访问,这样的数据类型统称为序列。 其中,字符串和元组中的元素不能修改,而列表中的元素可以修改。 集合 1. 与元组和列表类似,Set (集合&a…...
c# 排序、强转枚举
List<Tuple<double,int>> mm中doble从小到大排序 mm本身排序 在C#中,如果你有一个List<Tuple<double, int>>类型的集合mm,并且你想要根据Tuple中的double值(即第一个元素)从小到大进行排序,同…...
“华为杯”第十六届中国研究生数学建模竞赛-C题:视觉情报信息分析
目录 摘 要: 一、问题重述 二、模型假设 三、符号说明 四、问题一分析与求解 4.1 问题一分析 4.2 模型建立 4.2.1 位置变换模型建立 4.2.4 多平面转换模型建立 4.3 模型求解 4.3.1 问题一图 1 结果 4.3.2 问题一图 2 结果 4.3.3 问题一图 3 结果 4.3.4 问题一图 4 结果 4.4 模…...
html+css+js网页设计 找法网2个页面(带js)ui还原度百分之90
htmlcssjs网页设计 找法网2个页面(带js)ui还原度百分之90 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑…...
018 | backtrader回测反转策略
什么是反转策略? 反转策略(Reversal Strategy)是一种试图捕捉市场价格趋势逆转的交易策略。与趋势跟随策略不同,反转策略的核心理念是“物极必反”,即价格在经过一段时间的单边趋势后,往往会出现逆转的机会…...
《图解HTTP》全篇目录
前言 目前,国内讲解 HTTP 协议的书实在太少了。在我的印象中,讲解网络协议的书仅有两本。一本是《HTTP 权威指南》,但其厚度令人望而生畏;另一本是《TCP/IP 详解,卷 1》,内容艰涩难懂,学习难度…...
基于VS2019(Release_x64)+Qt的软件开发—环境配置
前置博客: 基于C高级编程语言的软件开发随记——环境变量-CSDN博客 (一)一种避免设置大量环境变量的VS2019环境配置方法 Ⅰ 解决方案资源管理器->VC目录->在包含目录/库目录中添加对应的include/lib文件夹($(So…...
【书生大模型实战营(暑假场)闯关材料】入门岛:第1关 Linux 基础知识
【书生大模型实战营(暑假场)闯关材料】入门岛:第1关 Linux 基础知识 1. 使用VScode进行SSH远程连接服务器2. 端口映射及实例参考文献 这一博客主要介绍使用VScode进行服务器远程连接及端口映射。 1. 使用VScode进行SSH远程连接服务器 安装V…...
OpenProject:构建高效团队协作的终极开源项目管理平台
OpenProject:构建高效团队协作的终极开源项目管理平台 【免费下载链接】openproject OpenProject is the leading open source project management software. 项目地址: https://gitcode.com/GitHub_Trending/op/openproject OpenProject 是一款领先的开源项…...
终极WindowResizer完整指南:让窗口调整随心所欲
终极WindowResizer完整指南:让窗口调整随心所欲 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否遇到过无法调整大小的应用窗口?WindowResizer是一款强…...
R Markdown网站生成器使用教程:如何快速搭建技术文档网站 [特殊字符]
R Markdown网站生成器使用教程:如何快速搭建技术文档网站 📊 【免费下载链接】rmarkdown Dynamic Documents for R 项目地址: https://gitcode.com/gh_mirrors/rm/rmarkdown R Markdown是一个强大的动态文档生成工具,能够将代码、输出…...
隐私保护×效率提升:开源OCR工具如何重构3大行业文本处理流程
隐私保护效率提升:开源OCR工具如何重构3大行业文本处理流程 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多…...
保姆级教程:用Python+OpenCV搞定汽车360全景拼接(附C++移植思路)
从零构建汽车360全景系统:PythonOpenCV实战与C工程化指南 当你第一次坐上驾驶座,启动车辆时,中控屏上突然展现出车辆周围无死角的鸟瞰视图——这就是现代汽车360全景系统带来的神奇体验。作为提升驾驶安全性和便利性的关键技术,它…...
08_Claude Code之高级工作流与自动化:循环、调度与并行批处理
08 Claude Code之高级工作流与自动化:循环、调度与并行批处理 Claude Code 的真正价值在于自动化能力,而不仅仅是对话工具。本文深度讲解 Plan Mode 的量化对比(多文件重构成功率从62%到89%)、非交互批处理脚本、并行处理架构、CI…...
像素剧本圣殿惊艳案例:故障艺术标题下生成的赛博朋克短剧完整场次
像素剧本圣殿惊艳案例:故障艺术标题下生成的赛博朋克短剧完整场次 1. 像素剧本圣殿创作工具介绍 Pixel Script Temple(像素剧本圣殿)是一款基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。这个独特的创作平台将先进的AI推理能力与复…...
终极中文语义理解指南:text2vec-base-chinese如何让AI真正读懂中文
终极中文语义理解指南:text2vec-base-chinese如何让AI真正读懂中文 【免费下载链接】text2vec-base-chinese 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/text2vec-base-chinese 还在为中文文本相似度计算而烦恼吗?text2vec-base-c…...
基于python宠物医院药品管理系统的设计与实现
目录同行可拿货,招校园代理 ,本人源头供货商功能模块设计技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块设计 药品信息管理模块 实现药品基础信息的…...
详解bat脚本:语法、常见用法、注意事项、示例
文章目录前言1.什么是BAT 脚本2.基本语法2.1 注释2.2 基本命令执行3.常用命令详解4.变量使用1. 定义变量2. 使用变量(要用 % 括起来)5.流程控制5.1 if 条件判断基本语法:常用比较:示例:5.2 for 循环遍历文件࿰…...
