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

23种设计模式-结构型模式之组合模式(Java版本)

Java 组合模式(Composite Pattern)详解

🌳 什么是组合模式?

组合模式用于将对象组合成树形结构以表示“部分-整体”的层次结构,使客户端可以统一对待单个对象和组合对象


🧠 使用场景

  • 希望客户端忽略对象组合和单个对象的差别
  • 表示树形结构,如图形、文件系统、组织架构等

🏗️ 模式结构

  • Component(抽象构件):定义所有对象的共同接口
  • Leaf(叶子节点):树的末端节点,无子节点
  • Composite(容器构件):有子节点,实现子节点管理逻辑

✅ 示例:文件系统结构

抽象组件(Component)

public abstract class FileComponent {protected String name;public FileComponent(String name) { this.name = name; }public abstract void display(String indent);
}

叶子节点(Leaf)

public class FileLeaf extends FileComponent {public FileLeaf(String name) {super(name);}@Overridepublic void display(String indent) {System.out.println(indent + "📄 " + name);}
}

组合节点(Composite)

import java.util.ArrayList;
import java.util.List;public class FolderComposite extends FileComponent {private List<FileComponent> children = new ArrayList<>();public FolderComposite(String name) {super(name);}public void add(FileComponent component) {children.add(component);}public void remove(FileComponent component) {children.remove(component);}@Overridepublic void display(String indent) {System.out.println(indent + "📁 " + name);for (FileComponent component : children) {component.display(indent + "    ");}}
}

客户端调用

public class Client {public static void main(String[] args) {FolderComposite root = new FolderComposite("Root");FolderComposite docs = new FolderComposite("Documents");FolderComposite pics = new FolderComposite("Pictures");FileLeaf file1 = new FileLeaf("Resume.pdf");FileLeaf file2 = new FileLeaf("CoverLetter.docx");FileLeaf img1 = new FileLeaf("Photo.jpg");docs.add(file1);docs.add(file2);pics.add(img1);root.add(docs);root.add(pics);root.display("");}
}

🧩 优点

  • 清晰地定义树形结构

  • 客户端可以一致性地处理单个对象和组合对象

  • 增加新类型节点方便

⚠️ 缺点

  • 抽象层与组合层差异被忽略,可能降低类型安全

  • 违反开闭原则:添加新功能可能需要修改组件接口

✅ 使用建议

当你需要表示一个树形结构,并希望客户端可以**透明地处理所有节点(不关心是组合还是叶子)**时,组合模式就是你的首选。

http://www.xdnf.cn/news/1342.html

相关文章:

  • Netty的心跳机制怎么实现的?
  • uniapp返回上一页接口数据更新了,页面未更新
  • 嵌入式WebRTC音视频实时通话EasyRTC助力打造AIOT智能硬件实时通信新生态
  • 【小皮(PHPstudy】
  • Collection集合,List集合,set集合,Map集合
  • 主流单片机厂商/系列、型号、内核、主频、Flash、RAM、关键外设、特殊功能、典型应用及选型对比与分析,
  • 学习海康VisionMaster之卡尺工具
  • 【redis】主从复制
  • MATLAB 下载安装教程
  • ubuntu系统下部署使用git教程
  • 第五章:Benchmark Framework
  • C# .NET Core 批量下载文件
  • 【最新版】沃德代驾源码全开源+前端uniapp
  • rust编程学习(三):8大容器类型
  • Linux:42线程控制lesson30
  • [进程通信] 管道 vs 共享内存 vs 网络
  • Linus的权限问题
  • 强化学习和微调 区别如下
  • PostgreSQL认证培训推荐机构
  • 动态提示词(小模型)、RAG和提示词系统
  • LLMs可在2位精度下保持高准确率
  • C语言高频面试题——sizeof和strlen的区别
  • Unity设计模式实战:用单例和观察者模式优化你的游戏架构 (Day 36)
  • 初次尝试Ghidra
  • C++进阶--二叉搜索树
  • NGINX如何处理并发请求?你会如何调整NGINX的配置以优化性能?
  • 【Ultralytics 使用yolo12 读取tiff 数据异常解决】
  • el-table表格既出现横向滚动条,又出现纵向滚动条?
  • 跨团队协作时流程不统一,如何协调
  • 部署Megatron - LM,快速上手使用