当前位置: 首页 > news >正文

组合模式详解

什么是组合模式?

组合模式(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 元素的父子结构
  • 🏢组织架构:公司 → 部门 → 员工
  • 🎮游戏对象层级:场景 → 角色 → 武器/特效
  • 📂菜单系统:主菜单 → 子菜单 → 菜单项

总结

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

http://www.cnnetsun.cn/news/52622.html

相关文章:

  • RISCV的异常和中断
  • vue基于Spring Boot框架的水果商城设计与实现_6628xfyb_
  • 【入门级-数据结构-3、特殊树:完全二叉树的定义与基本性质】
  • python用openpyxl操作excel-读取或创建excel文件
  • 刷题日记day5(二分+前缀和)
  • 005-AES:采招网
  • 基于python+django的在线考试系统(源码+lw+部署文档+讲解等)
  • C语言一维与二维数组名详解:从本质理解到高手应用
  • 当水印遇见AI:一场像素级的美学修复之旅
  • 软件测试是保障软件质量的关键环节,尤其在当前无法完全依赖形式化方法证明软件正确性的背景下,测试成为发现缺陷最主要、最有效的手段
  • 如何用AI快速生成Flink面试题答案?
  • 10分钟搞定:DeepSeek本地开发环境快速搭建方案
  • 豆包AI手机智能操控的硬核原理
  • CVE-2023-48795漏洞深度解析:原理与影响
  • 深入解析strspn:字符串扫描的精确尺子
  • 纺织AI设计系统:用技术重构创意与效率
  • 用AI辅助开发:weditor的自动化测试新体验
  • vivo真机adb 命令获取手机当前窗口信息
  • 3分钟极速安装!MinGW自动化方案对比
  • Spring Boot依赖冲突:新手必看指南
  • 1小时快速搭建Kiro下载工具原型
  • GitLab本地部署效率革命:比官方文档快3倍的极简方案
  • 智能问数如何让数据分析效率提升10倍
  • Phyfusion在游戏开发中的5个惊艳应用案例
  • 电商网站商品筛选栏的sticky定位实战
  • 零基础学结构体:从概念到实战5个例子
  • 5分钟搭建status_invalid_image_hash检测原型
  • 人工智能应用-机器视觉:车牌识别(1)
  • 5分钟搞定node-sass配置:快速原型开发指南
  • 幽冥大陆(四十九)PHP打造Java的Jar实践——东方仙盟筑基期