【玩转23种Java设计模式】结构型模式篇:组合模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理

文章目录

  • 一、简介
  • 二、实例
    • 1、抽象组件
    • 2、叶子节点:文件
    • 3、组合节点:文件夹
    • 4、客户端使用
  • 三、总结
    • 1、优点
    • 2、缺点
    • 3、应用场景

一、简介

  组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示"部分-整体"的层次关系。其核心思想是通过统一接口处理叶子对象(单个元素)和组合对象(容器元素),使客户端无需区分操作的是单个对象还是整个组合结构。

核心角色:

  • Component:声明组合对象的通用接口
  • Leaf:叶子节点(无子节点)
  • Composite:容器节点(包含子组件集合)

二、实例

假设需要构建文件系统,包含文件夹(组合对象)和文件(叶子对象)。

1、抽象组件

interface FileSystemComponent {void display(int indent);long getSize();
}

2、叶子节点:文件

class File implements FileSystemComponent {private String name;private long size;public File(String name, long size) {this.name = name;this.size = size;}@Overridepublic void display(int indent) {System.out.println(" ".repeat(indent) + "📄 " + name + " (" + size + "KB)");}@Overridepublic long getSize() { return size; }
}

3、组合节点:文件夹

class Directory implements FileSystemComponent {private String name;private List<FileSystemComponent> children = new ArrayList<>();public Directory(String name) {this.name = name;}public void add(FileSystemComponent component) {children.add(component);}@Overridepublic void display(int indent) {System.out.println(" ".repeat(indent) + "📁 " + name);children.forEach(child -> child.display(indent + 2));}@Overridepublic long getSize() {return children.stream().mapToLong(FileSystemComponent::getSize).sum();}
}

4、客户端使用

public class Demo {public static void main(String[] args) {Directory root = new Directory("Root");Directory documents = new Directory("Documents");documents.add(new File("resume.pdf", 256));documents.add(new File("notes.txt", 128));Directory images = new Directory("Images");images.add(new File("photo1.jpg", 2048));root.add(documents);root.add(images);root.display(0);System.out.println("Total size: " + root.getSize() + "KB");}
}

输出示例:
📁 Root
📁 Documents
📄 resume.pdf (256KB)
📄 notes.txt (128KB)
📁 Images
📄 photo1.jpg (2048KB)
Total size: 2432KB

三、总结

1、优点

  • 简化客户端代码:统一处理单个对象与组合结构。
  • 高扩展性:新增组件类型无需修改现有代码。
  • 天然支持递归结构:方便实现树形操作(如遍历、统计)。

2、缺点

  • 类型安全性问题:需要运行时类型检查。
  • 接口设计难度:需兼顾叶子与容器的不同需求。
  • 可能违反接口隔离原则:需要为不需要的方法提供空实现。

3、应用场景

  • GUI组件库(窗口包含面板/按钮等)。
  • 组织架构管理系统(部门包含员工/子部门)。
  • 数学表达式解析(操作符包含子表达式)。
  • 游戏场景图(父节点包含子节点)。
  • XML/JSON文档处理。

  当系统需要处理树形结构,且希望以统一方式操作层次中的不同元素时,组合模式是最佳选择。其价值在于模糊了简单元素与复杂元素的边界,让复杂的层次结构变得易于管理和扩展。

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

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

相关文章

如何选取合适的 NewRatio 值来优化 JVM 的垃圾回收策略

目录 一、垃圾回收模型简介 &#xff08;一&#xff09;新生代&#xff08;Young Generation&#xff09; &#xff08;二&#xff09;老年代&#xff08;Old Generation&#xff09; &#xff08;三&#xff09;NewRatio 的作用与影响 &#xff08;四&#xff09;图解&am…

Element Plus中的树组件的具体用法(持续更新!)

const defaultProps {//子树为节点对象的childrenchildren: children,//节点标签为节点对象的name属性label: name, } 属性 以下是树组件中的常用属性以及作用&#xff1a; data&#xff1a;展示的数据&#xff08;数据源&#xff09; show-checkbox&#xff1a;节点是否可…

第十一届蓝桥杯单片机国赛

什么&#xff1f;4T模拟赛和省赛做起来轻轻松松&#xff1f;不妨来挑战一下第十一届国赛&#xff0c;这一届的国赛居然没考超声波、串口通信&#xff01;只要你正确地理解了题目的意思&#xff0c;规避出题人挖的坑&#xff0c;拿个国一轻轻松松。 附件&#xff1a;第十一届蓝桥…

大彩串口屏开发 —— MODBUS通信

目 录 Modbus通信方式 1 使用变量与协议设置方式 2 使用LUA脚本方式 3 两者结合 Modbus通信 大彩串口屏可以采用三种方式实现与其它设备进行modbus通信和逻辑处理。 方式 1 使用变量与协议设置 步骤1 在协议设置里进行设置&#xff0c;包括开启modbus协议&#xff0c;屏做为主…

【Linux docker】关于docker启动出错的解决方法。

无论遇到什么docker启动不了的问题 就是 查看docker状态sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三个配置文件&#xff08;可能是配置的时候格式错误&#xff09;&#xff1a;/etc/docker/daemon.json&#xff08;如果存在&#xf…

怎么实现: 大语言模型微调案例

怎么实现: 大语言模型微调案例 目录 怎么实现: 大语言模型微调案例输入一个反常识的问题:首都在北京天安门之后对输出模型进行测试:首都在北京天安门微调代码:测试微调模型代码:微调输出模型结构输出模型参数大小对比Qwen 2.5_0.5:53MB输出模型:951MB 是一样的,没有进行…

rdiff-backup备份

目录 1. 服务器备份知识点 1.1 备份策略 1.2 备份步骤和宝塔面板简介 1.3 CentOS7重要目录 2. 备份工具 2.1 tar -g 备份演示 2. rsync 备份演示 3. rdiff-backup 备份演示 4. 差异和优缺点 3. rdiff-backup安装和使用 3.1 备份命令rdiff-backup 3.2 恢复命令--…

Claude:AI领域的多面手,从语言模型到智能编码

文章目录 引言Claude的起源与发展1. Claude的诞生2. Claude 3.7 Sonnet的突破 版本迭代技术原理Claude的独特优势混合推理模式成本与性能的平衡开发者友好的工具 功能及应用Claude的未来展望结论 引言 Claude是由Anthropic公司开发的大型语言模型&#xff0c;在人工智能领域&a…

RocketMQ 详细教程(Spring Boot Spring Cloud Alibaba)

1. RocketMQ 简介 RocketMQ 是阿里巴巴开源的一款分布式消息队列&#xff0c;具有高吞吐量、低延迟、可靠性等特点&#xff0c;广泛应用于金融、电商、物联网等领域。 RocketMQ 的核心特性&#xff1a; 高可靠性&#xff1a;支持消息存储、重复消费、失败重试等高可用性&…

Spring(七)AOP-代理模式

目录 代理模式 一 静态代理 一、核心作用 二、使用场景 二 动态代理 一、核心作用 二、使用场景 具体实现&#xff1a;&#xff08;初始&#xff09; 具体实现&#xff1a;&#xff08;改进&#xff09; 一、核心业务逻辑 1. 接口 MathCalculator 2. 实现类 MathCa…

Java Lambda表达式:现代编程的简洁之道

引言 在Java 8中&#xff0c;Lambda表达式的引入标志着Java语言向函数式编程迈出了重要一步。Lambda不仅简化了代码结构&#xff0c;还提升了开发效率&#xff0c;使得Java能够更灵活地应对现代编程需求。本文将深入探讨Lambda表达式的核心概念、语法规则、应用场景及其对Java…

BGP分解实验·21——BGP选路原则之本地优先级

当使用BGP路径属性——本地优先级&#xff0c;进行路由优选时&#xff0c;优选“本地优先级”数值较大的那个。&#xff08;eBGP之间更新不携带这个属性&#xff09; 实验拓扑如下&#xff1a; 在未实现本地优先级策略前&#xff0c;先在各个BGP之间配置完成基本连接。 R1的基…

【redis】应用场景:共享会话和手机验证码

文章目录 共享会话实现思路 手机验证码实现思路伪代码实现生成验证码验证验证码 共享会话 实现思路 如果每个应用服务器&#xff0c;维护自己的会话数据&#xff0c;此时彼此之间胡共享&#xff0c;用户请求访问到不同的服务器上&#xff0c;就可能会出现一些不能正确处理的情…

通义万相 2.1 + 蓝耘算力,AI 视频生成的梦幻组合

在这个科技日新月异的时代&#xff0c;人工智能不断刷新着我们对世界的认知。一次偶然的机会&#xff0c;我借助北京蓝耘科技股份有限公司提供的算力支持&#xff0c;踏上了使用通义万相 2.1 进行 AI 视频生成的奇妙之旅。 目录 1.1初遇蓝耘科技&#xff1a; 1.2通义万相 2.1…

【Go万字洗髓经】Golang内存模型与内存分配管理

本文目录 1. 操作系统中的虚拟内存分页与进程管理虚拟内存与内存隔离 2. Golang中的内存模型内存分配流程内存单元mspan线程缓存mcache中心缓存mcentral全局堆缓存mheapheapArena空闲页索引pageAlloc 3. Go对象分配mallocgc函数tiny对象分配内存 4.结合GMP模型来看内存模型tiny…

33.HarmonyOS NEXT NumberBox 步进器高级技巧与性能优化

HarmonyOS NEXT NumberBox 步进器高级技巧与性能优化 一、高级交互设计 1. 组件联动控制 // 与Slider双向绑定 State value: number 50Slider({value: this.value,onChange: (v) > this.value v })NumberBox({value: this.value,onChange: (v) > this.value v })2. …

关于ModbusTCP/RTU协议转Ethernet/IP(CIP)协议的方案

IGT-DSER智能网关模块支持西门子、倍福(BECKHOFF)、罗克韦尔AB&#xff0c;以及三菱、欧姆龙等各种品牌的PLC之间通讯&#xff0c;支持Ethernet/IP(CIP)、Profinet(S7)&#xff0c;以及FINS、MC等工业自动化常用协议&#xff0c;同时也支持PLC与Modbus协议的工业机器人、智能仪…

通义万相2.1 × 蓝耘智算:AIGC 界的「黄金搭档」如何重塑创作未来?

在人工智能生成内容&#xff08;AIGC&#xff09;领域&#xff0c;通义万相2.1与蓝耘智算的结合&#xff0c;正以技术协同效应重新定义创作的可能性。这一组合不仅突破了传统创作工具的效率瓶颈&#xff0c;更通过算法与算力的深度融合&#xff0c;为影视、广告、游戏、教育等领…

【FreeRTOS】FreeRTOS操作系统在嵌入式单片机上裸机移植

目录 一 RTOS概述 二 FreeRTOS移植 三 FreeRTOS使用 四 附录 一 RTOS概述 先了解一些基础概念&#xff0c;以下内容摘自FreeRTOS官网&#xff08;FreeRTOS™ - FreeRTOS™&#xff09;&#xff1a; 【1】RTOS基础知识 实时操作系统 (RTOS) 是一种体积小巧、确定性强的计算机…

文件包含漏洞第一关

一、什么是文件包含漏洞 1.文件包含漏洞概述 和SQL注入等攻击方式一样&#xff0c;文件包含漏洞也是一种注入型漏洞&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务端执行。 什么叫包含呢&#xff1f;以PHP为例&#xff0c;我们常常把可重复使…