23种设计模式——组合模式(Composite Pattern) - 指南

news/2025/9/30 13:57:00/文章来源:https://www.cnblogs.com/yxysuanfa/p/19120987

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
个人主页:Meteors.的博客
当前专栏:设计模式
✨特色专栏:知识分享
本文内容:23种设计模式——组合模式(Composite Pattern)
** ps **  :阅读文章如果有挑战或者疑惑,欢迎在评论区提问或指出。


目录

一. 背景

二. 介绍

三. 核心概念

四. 代码示例

五. 特点

六. 适用场景

七. 最佳实践

八. 总结


一. 背景

组合,想必学过设计模式或者UML的都不陌生,不就一个类引用另一个类作为实例吗。不过加上模式二字,可能很多人就不知道了...不过我提醒你,存有许多文件的文件夹就是这种模式的标准案例,你的脑海中,就有一个大概的模型了。


二. 介绍

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示"部分-整体"的层次关系。此种模式使得客户端可以统一地处理单个对象和对象组合,而不需要区分它们是叶子节点还是组合节点。


三. 核心概念

组件接口(Component):定义树中对象的共同接口,行是抽象类或接口
叶子节点(Leaf):树中的终端节点,不包含子节点
复合节点(Composite):包含子节点的节点,实现组件接口并管理子节点


四. 代码示例

下面是一个使用了组合模式的文件夹demo:

import java.util.ArrayList;
import java.util.List;
// 1. 组件接口 (Component)
abstract class FileSystemComponent {protected String name;public FileSystemComponent(String name) {this.name = name;}public abstract void display(int depth);public abstract long getSize();
}
// 2. 叶子节点 (Leaf)
class File extends FileSystemComponent {private long size;public File(String name, long size) {super(name);this.size = size;}@Overridepublic void display(int depth) {System.out.println(" ".repeat(depth) + "- File: " + name + " (" + size + "KB)");}@Overridepublic long getSize() {return size;}
}
// 3. 复合节点 (Composite)
class Directory extends FileSystemComponent {private List children = new ArrayList<>();public Directory(String name) {super(name);}public void add(FileSystemComponent component) {children.add(component);}public void remove(FileSystemComponent component) {children.remove(component);}@Overridepublic void display(int depth) {System.out.println(" ".repeat(depth) + "+ Directory: " + name);for (FileSystemComponent component : children) {component.display(depth + 2);}}@Overridepublic long getSize() {long totalSize = 0;for (FileSystemComponent component : children) {totalSize += component.getSize();}return totalSize;}
}
// 使用示例
public class CompositePatternDemo {public static void main(String[] args) {// 创建文件File file1 = new File("file1.txt", 100);File file2 = new File("file2.jpg", 250);File file3 = new File("file3.pdf", 50);// 创建目录Directory root = new Directory("Root");Directory documents = new Directory("Documents");Directory images = new Directory("Images");// 构建树形结构root.add(documents);root.add(images);documents.add(file1);documents.add(file3);images.add(file2);// 显示文件系统结构root.display(0);// 计算总大小System.out.println("\nTotal size: " + root.getSize() + "KB");}
}


五. 特点

优点:

  • 统一处理单个对象和组合对象
  • 容易扩展和增加新的组件类型
  • 简化客户端代码,使其不需要区分个体和组合
  • 符合开闭原则

缺点:

  • 设计复杂,需要清晰定义组件接口
  • 难以限制容器中的构件类型
  • 不易用继承的方法来增加新的行为

六. 适用场景

  1. 表示对象的部分-整体层次结构
    • 文件系统、菜单系统、组织架构
    • 需要以树形结构表示的对象模型
  2. 希望用户忽略组合对象与单个对象的不同
    1. 客户端可以统一应用组合结构和单个对象
    2. 不想让客户端关注处理的是单个对象还是组合对象
  3. 结构具有递归特性
    1. UI界面组件(如Android的View和ViewGroup)
    2. XML/HTML文档结构
    3. 语法分析树

七. 最佳实践

明确组件接口:组件接口应该定义组合中所有对象的公共行为
合理处理异常:在Component中为叶子节点不支持的操作提供默认实现
考虑性能:对于大型树结构,避免深度递归操作
类型安全:能够通过泛型等方式增强类型安全性


八. 总结

组合模式是一种强大的设计模式,特有适合处理具有层次结构的对象。它经过将对象组织成树形结构,使得客户端可以统一处理个体对象和组合对象。在实际开发中,特别是在UI体系和树形数据结构处理中,组合模式得到了广泛应用。
当你需要表示对象的部分-整体层次结构,并希望用户忽略组合对象与单个对象的不同,可能考虑应用组合模式。这种模式能够简化客户端代码,提高系统的可扩展性和可维护性。


最后,

其它设计模式会陆续更新,希望文章对你有所协助!

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

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

相关文章

网站开发报价单 excel曰本做爰l网站

文档介绍&#xff1a;6.5 算术逻辑单元一、ALU 电路四位 ALU 74181M 0 算术运算M 1 逻辑运算S3 ~ S0 不同取值,可做不同运算ALUAiBiFi…SiM位片式运算器4位双极型位片式运算器AM2901,它将ALU、通用寄存器组、多路开关、移位器等逻辑构件集成在一个芯片内。通用寄存器寄存器写…

2025年破碎机厂家最新权威推荐榜:破碎机实力厂商技术服务全景评测及选购指南

在矿山开发、冶金加工、建材生产等核心领域,破碎机作为关键生产装备,其性能与服务直接决定项目效率、资源利用率及运营成本。当前市场中,破碎机品牌超千家,产品质量与服务能力却存在显著差距:部分厂商缺乏核心技术…

网站做发做网站站长先把作息和身体搞好

当某些sql因为不知名原因堵塞时&#xff0c;为了不影响后台服务运行&#xff0c;想要给sql增加执行时间限制&#xff0c;超时后就抛异常&#xff0c;保证后台线程不会因为sql堵塞而堵塞。 方法一 yml全局配置&#xff1a;单数据源可以&#xff0c;多数据源时会失效 方法二 j…

什么关系?就是ajax与jQuery

什么关系?就是ajax与jQuerypre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

网站建设过时了吗没有网站没有推广如何做外贸

目录 1 创建购物车2 增加数量3 减少数量4 切换分类时回填数据5 显示购物车信息总结 我们上一篇搭建了点餐业务的数据初始化加载&#xff0c;本篇实现一下加入购物车的功能。在购物车设计的时候有两种方案&#xff0c;一种是使用数据表的方案&#xff0c;一种是使用变量的方案。…

完整教程:Redis数据结构和常用命令

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【光照】[PBR][法线分布]为何不选Beckmann

本文探讨了Beckmann分布函数在游戏渲染中的应用及其与GGX的对比。Beckmann是最早的微表面法线分布函数,基于高斯分布假设,具有物理准确性但计算复杂度较高。GGX因更符合真实材质反射特性、能量守恒良好、计算效率更高…

网站导航页面制作网站宣传页面

题目 给定一个长度为 n1 的数组nums&#xff0c;数组中所有的数均在 1∼n 的范围内&#xff0c;其中 n≥1。请找出数组中任意一个重复的数&#xff0c;但不能修改输入的数组。样例 给定 nums [2, 3, 5, 4, 3, 2, 6, 7]。 返回 2 或 3。思考题&#xff1a; 如果只能使用 O(1) …

钓鱼网站怎么做的专做衬衫的网站

英语自我介绍&#xff0c;介绍完老师会根据你的回答用英语问你问题&#xff0c;比如介绍一下你的本科学校&#xff0c;或者家乡什么的。计网过一遍&#xff0c;会问两道题。接下来是重点&#xff0c;我当时是根据我成绩单&#xff0c;问了我本科学过的科目&#xff0c;比如pyth…

2025标志牌生产厂家最新推荐排行榜:权威筛选优质标志牌品牌,助您精准选对交通标志牌,反光标志牌,道路标志牌供应商!

随着道路建设与交通管理需求的不断提升,标志牌作为保障通行安全、传递交通信息的核心设施,市场需求持续增长。但当前标志牌生产行业中,厂家数量繁杂,产品质量差距悬殊 —— 部分产品存在铝板厚度不达标、反光膜亮度…

2025 年脚手架厂家最新推荐榜:铝合金 / 盘扣 / 快装 / 移动式等多类型产品优选及国内实力企业排行指南

2025 年国内脚手架行业在基建加码与装配式建筑发展中持续扩容,但市场痛点凸显:传统扣件式产品仍占 42% 份额,安全与效率短板显著,钢管价格上涨进一步压缩利润空间,新国标下部分产品合规性不足。更关键的是,近五年…

清远网站seo公司网站建设平台策划

Hello大家好我是咕噜铁蛋&#xff01;你是否曾为生成二维码而烦恼过&#xff1f;别担心&#xff0c;今天我就来给你支招&#xff01;&#xff0c;我将分享如何使用Java生成微信小程序二维码的方法&#xff0c;让你轻松应对二维码生成的需求。微信小程序是一种轻量级的应用程序&…

2025年沈阳标识标牌厂家最新推荐榜单:涵盖订做标识标牌,广告标识标牌,安全出口标识标牌、不锈钢等多类型标识,全面解读企业产能与技术实力

在城市建设加速、商业场景多元化的当下,标识标牌作为信息传递与环境导向的核心载体,其品质与服务直接影响项目落地效果。然而,当前市场上标识标牌厂家数量繁杂,部分企业存在产能不足、技术落后、设计同质化等问题,…

网站开发研究的方法与技术路线网络营销渠道的功能

哥伦比亚大学实力介绍哥伦比亚大学除去常青藤的榜首地位&#xff0c;研究生的金融工程 更是被人们称为是金工届的magic seven 并且商学院以及MBA项目是很多人垂涎已久的。更有远近闻名的国际公共关系事物学院&#xff0c;以及新闻专业。2020年TFE Times美国计算机科学硕士排名参…

别再迷信甘特图了!90%的项目用它都错了

甘特图被90%的项目团队误用,导致其真正的管理价值被严重低估。作为最经典的项目规划工具,甘特图本应通过时间轴可视化、任务依赖关系展示和资源分配监控来提升协作效率,但多数使用者陷入七个致命误区:将其视为静态…

c2c网站建设费用福建省建设厅网站人员

图像到卡通 一、说明 在当今世界&#xff0c;我们被图像和视频所包围。从社交媒体到广告&#xff0c;图像已成为一种强大的交流媒介。但是你有没有想过&#xff0c;如果你能把你的照片变成卡通会发生什么&#xff1f;想象一下&#xff0c;为您最喜欢的照片创建动画版本&#xf…

手机网站建设流程国际新闻最近新闻军事

Zabbix核心组件主要是Agent和Server&#xff0c;其中Agent主要负责采集数据并通过主动或者被动的方式采集数据发送到Server/Proxy&#xff0c;除此之外&#xff0c;为了扩展监控项&#xff0c;Agent还支持执行自定义脚本。 作者&#xff1a;艺术生的运维路来源&#xff1a;今日…

浙江建设集团网站手机网站建设找哪家

在内核编程中字符串有两种格式ANSI_STRING与UNICODE_STRING&#xff0c;这两种格式是微软推出的安全版本的字符串结构体&#xff0c;也是微软推荐使用的格式&#xff0c;通常情况下ANSI_STRING代表的类型是char *也就是ANSI多字节模式的字符串&#xff0c;而UNICODE_STRING则代…

廉政建设网评文章网站直播网站app下载

介绍 假设现有外网笔记本、云服务器、内网工作站三台设备&#xff0c;希望使用外网笔记本通过云服务器转发&#xff0c;访问内网工作站&#xff1b;这里使用frp进行内网穿透。 云服务器端配置 登录腾讯轻量型云服务器控制台&#xff0c;开放转发端口、bind_port以及deshboad…

杭州设计门户网站沧州地区做网站

背景 jenkins 是使用 docker 方式部署的, 在 jenkins中又配置了 docker 的命令, 使用的宿主机的 docker 环境, 在jenkins 中执行 docker 相关命令的时候报错 jenkinse0e7b943b6e4:/$ docker login -u admin -p Harbor12345 172.16.100.15:80 WARNING! Using --password via t…