java23种设计模式-组合模式

news/2025/2/27 7:14:47/

组合模式(Composite Pattern)学习笔记

🌟 定义

组合模式属于结构型设计模式,用于将对象组合成树形结构以表示"部分-整体"层次结构。它使得用户对单个对象和组合对象的使用具有一致性。


🎯 适用场景

  1. 需要表示对象的部分-整体层次结构
  2. 希望客户端忽略组合对象与单个对象的不同
  3. 需要树形菜单/文件系统等层次结构
  4. 需要递归处理所有节点的情况

🔧 模式结构

📐 类图(透明式实现)

«abstract»
Component
+operation()
+add(Component)
+remove(Component)
+getChild(int) : Component
Leaf
+operation()
+add(Component)
+remove(Component)
+getChild(int) : Component
Composite
-children: List
+operation()
+add(Component)
+remove(Component)
+getChild(int) : Component

🛠️ 核心组成

  1. Component(抽象构件)

    • 定义所有对象的通用接口
    • 声明管理子组件的方法(可选)
  2. Leaf(叶子构件)

    • 表示组合中的叶子节点(无子节点)
    • 实现组件接口的基础操作
  3. Composite(复合构件)

    • 存储子组件(Leaf或其他Composite)
    • 实现与子组件相关的操作方法

📝 代码示例

文件系统案例

// 抽象组件
interface FileSystemComponent {void display(int indent);
}// 文件(叶子节点)
class File implements FileSystemComponent {private String name;public File(String name) {this.name = name;}@Overridepublic void display(int indent) {System.out.println(" ".repeat(indent) + "📄 " + name);}
}// 目录(复合节点)
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);}public void remove(FileSystemComponent component) {children.remove(component);}@Overridepublic void display(int indent) {System.out.println(" ".repeat(indent) + "📁 " + name);for (FileSystemComponent child : children) {child.display(indent + 2);}}
}// 客户端使用
public class Client {public static void main(String[] args) {Directory root = new Directory("根目录");Directory doc = new Directory("文档");doc.add(new File("简历.pdf"));doc.add(new File("报告.docx"));Directory music = new Directory("音乐");music.add(new File("歌曲1.mp3"));music.add(new File("歌曲2.flac"));root.add(doc);root.add(music);root.add(new File("readme.txt"));root.display(0);}
}

✅ 优点

  1. 客户端可以统一处理单个对象和组合对象
  2. 更容易添加新类型的组件
  3. 符合开闭原则(通过递归组合创建复杂结构)
  4. 简化客户端代码(无需判断处理的是叶子还是组合对象)

⚠️ 缺点

  1. 设计较抽象(需要正确区分叶子节点和树枝节点)
  2. 可能违反接口隔离原则(叶子节点需要实现不需要的方法)
  3. 类型检查可能变得复杂
  4. 树形结构的限制(所有操作都需要符合树形结构逻辑)

🔄 相关模式对比

模式区别
装饰者模式动态添加职责 vs 组合静态结构
迭代器模式常与组合模式配合遍历树形结构
访问者模式用于对组合结构中的元素执行操作
享元模式共享叶节点以节省内存

💡 实践建议

  1. 优先考虑透明式组合模式(统一接口)
  2. 叶子节点的方法实现应抛出适当异常
  3. 使用缓存优化频繁访问操作
  4. 考虑使用空对象模式处理null子节点
  5. 对层次深度进行限制(避免栈溢出)

🚀 扩展应用

  • XML文档处理:DOM树解析
  • GUI组件系统:窗口包含面板,面板包含按钮
  • 组织结构图:部门与员工的树形表示
  • 语法树构建:编译器设计中的抽象语法树

📌 实现要点

  1. 组件接口设计:合理定义通用方法
  2. 子节点管理:复合节点需要实现增删查方法
  3. 递归遍历:复合节点需要递归调用子节点方法
  4. 异常处理:叶子节点对非支持操作的响应

掌握组合模式的关键在于理解递归组合统一接口的设计思想,它能有效简化复杂层次结构的操作逻辑,是处理树形结构问题的首选模式。


http://www.ppmy.cn/news/1575202.html

相关文章

从0-1搭建mac环境最新版

从0-1搭建mac环境 先查看自己的芯片信息 bash uname -mbash-3.2$ uname -m arm64这里是自己的型号安装brew xcode-select --install xcode-select -p /bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)” source /Users/lanren/.…

常见软件测试工具的解释

以下是一些常见软件测试工具的解释&#xff1a; 功能测试工具 Selenium&#xff1a;用于Web应用程序测试的开源工具&#xff0c;支持多种浏览器和编程语言&#xff0c;如Java、Python等。它通过操作浏览器来模拟用户行为&#xff0c;如点击按钮、输入文本、验证页面元素等&…

单片机总结【GPIO/TIM/IIC/SPI/UART】

一、GPIO 1、概念 通用输入输出口&#xff1b;开发者可以根据自己的需求将其配置为输入或输出模式&#xff0c;以实现与外部设备进行数据交互、控制外部设备等功能。简单来说&#xff0c;GPIO 就像是计算机或微控制器与外部世界沟通的 “桥梁”。 2、工作模式 工作模式性质特…

【Python LeetCode】面试经典 150 题

数组 / 字符串快慢指针&#xff08;双指针&#xff09;总结88. 合并两个有序数组27. 移除元素26. 删除有序数组中的重复项80. 删除有序数组中的重复项 II Boyer-Moore 投票算法169. 多数元素扩展&#xff1a;寻找 n/3 多数元素 翻转法189. 轮转数组 贪心121. 买卖股票的最佳时机…

IO 和NIO有什么区别?

在 Java 中&#xff0c;IO&#xff08;Input/Output&#xff09;即传统的标准输入输出&#xff0c;NIO&#xff08;New Input/Output&#xff09;是 Java 1.4 引入的新的 IO 库&#xff0c;它们之间存在多方面的区别&#xff0c;详细总结如下&#xff1a; 数据读取方式&#x…

【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】

最近帮某明星工作室做AI语音助手时遇到魔幻需求——要求用5秒的咳嗽声克隆出完整音色!传统TTS系统直接翻车,生成的语音像得了重感冒的电音怪物。直到祭出DeepSeek的TTS音色克隆黑科技,才让AI语音从"机器朗读"进化到"声临其境"。今天我们就来扒开这个声音…

使用 Docker 管理 Alpine 镜像的完整指南

在这篇博客中&#xff0c;我们将深入探讨如何使用 Docker 命令来拉取、保存和加载 Docker 镜像。我们将以 alpine 镜像为例&#xff0c;展示每个步骤的详细操作和输出示例。【因特殊原因可以借助外网下载镜像&#xff0c;然后导入到本地的服务器】 1. 拉取镜像 (docker pull) …

当AI搜索撕开传统搜索的裂缝,警惕AI搜索的“信息茧房”

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 人工智能&AIGC术语100条 Shelly聊AI-重…