news 2026/4/16 11:14:13

组合模式详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
组合模式详解

什么是组合模式?

组合模式(Composite Pattern),是一种结构型设计模式,这种模式将对象组合成树形结构,以表示部分--整体的层次关系,组合模式使得用户对单个对象和组合对象的使用具有一致性。

组合模式的结构

角色说明
Component抽象组件,定义叶子和容器的公共接口
Leaf叶子节点,实现 Component 的具体行为(如 File)
Composite容器节点,持有子组件列表,实现 Component 并提供 add/remove 等管理方法(如 Folder)

代码实现-文件系统示例

第一步:定义抽象组件FileSystemItem

public abstract class FileSystemItem { protected String name; public FileSystemItem(String name) { this.name = name; } /** * 显示文件或目录的信息 * @param indent 缩进级别,用于显示层级结构 */ public abstract void display(int indent); /** * 获取文件或目录的大小 * @return 文件或目录的大小(字节) */ public abstract long getSize(); // 工具方法:生成缩进 protected String getIndent(int level) { return " ".repeat(level); } }

第二步:实现叶子节点File

public class File extends FileSystemItem { private long size; public File(String name, long size) { super(name); this.size = size; } /** * 显示文件或目录的信息 * * @param indent 缩进级别,用于显示层级结构 */ @Override public void display(int indent) { System.out.println(getIndent(indent) + "📄 " + name + " (" + size + "KB)"); } /** * 获取文件或目录的大小 * * @return 文件或目录的大小(字节) */ @Override public long getSize() { return size; } }

第三步:实现容器节点Folder

public class Folder extends FileSystemItem { private List<FileSystemItem> children = new ArrayList<>(); public Folder(String name) { super(name); } /** * 显示文件或目录的信息 * * @param indent 缩进级别,用于显示层级结构 */ @Override public void display(int indent) { System.out.println(getIndent(indent) + "📁 " + name); for (FileSystemItem child : children) { child.display(indent + 1); // 递归显示子项 } } // 管理子组件的方法(仅 Composite 需要) public void add(FileSystemItem item) { children.add(item); } public void remove(FileSystemItem item) { children.remove(item); } public List<FileSystemItem> getChildren() { return Collections.unmodifiableList(children); } /** * 获取文件或目录的大小 * * @return 文件或目录的大小(字节) */ @Override public long getSize() { return children.stream() .mapToLong(FileSystemItem::getSize) .sum(); } }

第四步:客户端使用

public class CompositeDemo { public static void main(String[] args) { // 构建树形结构 Folder project = new Folder("MyProject"); Folder docs = new Folder("docs"); docs.add(new File("requirements.md", 10)); docs.add(new File("design.png", 500)); Folder src = new Folder("src"); src.add(new File("Main.java", 20)); src.add(new File("Utils.java", 15)); project.add(docs); project.add(src); project.add(new File("README.md", 5)); // 统一操作!无需区分 File 或 Folder project.display(0); System.out.println("\n总大小: " + project.getSize() + " KB"); } }

运行输出:

两种组合模式变体

类型特点优缺点
透明式(Transparent)Component 接口中声明所有方法(包括add,remove客户端完全透明,但 Leaf 必须抛出UnsupportedOperationException
安全式(Safe)只在 Composite 中定义管理子节点的方法类型安全,但客户端需知道对象是否为 Composite(如需调用add

我们上面的例子采用的是安全式,更符合 Java 的类型安全理念。

组合模式的优点

  • 简化客户端代码:统一接口,无需判断类型。
  • 易于扩展:新增组件类型不影响现有逻辑。
  • 天然支持递归操作:非常适合树形数据结构。

典型应用场景

  • 🖥️GUI 组件树:Swing/AWT 中的ContainerComponent
  • 🌐DOM 树操作:HTML 元素的父子结构
  • 🏢组织架构:公司 → 部门 → 员工
  • 🎮游戏对象层级:场景 → 角色 → 武器/特效
  • 📂菜单系统:主菜单 → 子菜单 → 菜单项

总结

组合模式通过抽象出统一的行为接口,巧妙地将“个体”与“整体”统一处理,极大提升了代码的可读性、可维护性和可扩展性

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 22:18:13

基于Spring Boot+Vue的档案数字化项目管理系统

目录 项目介绍 演示视频 系统展示 代码实现 推荐项目 项目开发总结 为什么选择我 源码获取 博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领…

作者头像 李华
网站建设 2026/4/10 8:39:36

vue基于Spring Boot框架的宠物收养志愿者管理系统的设计与实现_0mp970vp

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/4/15 18:20:21

顶与底判断顶底 通达信指标 源码分享

{}VAR2:LLV(LOW,10); VAR3:HHV(HIGH,25); 我:3.5,COLOR0088FF; 清仓: 3.5,COLORYELLOW,LINETHICK3; 减仓: 3.2,COLORBLUE; 动力线: EMA((CLOSE-VAR2)/(VAR3-VAR2)*4,4); 强弱线:1.75,LINETHICK1,COLORGREEN; 关注:0.5,COLORBLUE ; {} 数值:动力线,COLORA8A8A8; DRAWBAND(减仓,R…

作者头像 李华
网站建设 2026/4/14 8:23:55

进销存软件哪个简单好用,3天学会进销存

第1天&#xff1a;理解核心概念与基础流程 进销存的主要模块&#xff1a; 进&#xff1a;采购订单、采购入库、采购退货 销&#xff1a;销售订单、销售出库、销售退货 存&#xff1a;库存盘点、库存报损、库存预警 软件基础操作&#xff1a; 入库&#xff1a;新增入库单&#x…

作者头像 李华
网站建设 2026/4/14 5:35:09

QMS软件系统:一体化智能平台,智绘卓越质量新图景——全星质量管理QMS软件系统应用解析

QMS软件系统&#xff1a;一体化智能平台&#xff0c;智绘卓越质量新图景——全星质量管理QMS软件系统应用解析 在当今日益激烈的市场竞争中&#xff0c;质量不仅是企业的生命线&#xff0c;更是赢得客户信任、提升品牌价值的核心要素。《全星质量管理QMS软件系统》作为一套集成…

作者头像 李华
网站建设 2026/4/9 1:57:33

26、K8S-Sidecar代理

在 Kubernetes 中&#xff0c;Sidecar 代理是一种常见的设计模式&#xff0c;用于增强服务的功能和隔离服务的职责。Sidecar 代理通常与主应用容器一起部署在同一个 Pod 中&#xff0c;负责处理一些非业务的通用任务&#xff0c;例如网络流量管理、监控、日志记录、安全性增强等…

作者头像 李华