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

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("");}
}

🧩 优点

  • 清晰地定义树形结构

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

  • 增加新类型节点方便

⚠️ 缺点

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

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

✅ 使用建议

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

相关文章:

  • 黑马商城-微服务笔记
  • 云原生时代的双轮驱动
  • Unity 将Excel表格中的数据导入到Mysql数据表中
  • 4.23刷题记录(栈与队列专题)
  • 将输入帧上下文打包到下一个帧的预测模型中用于视频生成
  • RocketMQ 核心架构速览
  • Elasticsearch复习笔记
  • 数据集 | 苹果目标检测数据集
  • 车载功能测试-车载域控/BCM控制器测试用例开发流程【用例导出方法+优先级划分原则】
  • 如何避免AI编造虚假文献
  • CSS-跟随图片变化的背景色
  • 从GPT-5到Claude 3:大模型竞赛的下一站是什么?
  • 【ROS2】机器人操作系统安装到Ubuntu简介
  • 基于STM32、HAL库的MCP42010T数字电位器驱动程序设计
  • WebGL简介
  • rust编程学习(三):8大容器类型
  • Transformer 零基础实践教程 - 0 - 前言与环境配置
  • Rust 学习笔记:Rust 简介
  • element-ui transfer 组件源码分享
  • 远程控制Firefox浏览器实例的挑战与Playwright的CDP和Selenium Marionette解决方案
  • 嫦娥五号月球样品将借给这些国家机构
  • 牛市早报|特朗普称或将“大幅降低”对华关税,外交部回应
  • 云南大理州洱源县发生4.8级地震,震源深度10千米
  • 岳阳一管道疑似有黑水直排东洞庭湖,生态环境局:已赶往现场核查
  • 对话地铁读书人|超市营业员朱先生:通勤时间自学心理学
  • 南京84.57亿元成交8宗宅地:仅秦淮区一宗地块溢价成交