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

Java 设计模式-组合模式

Java 设计模式-组合模式

模式概述

组合模式简介

定义:组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一处理单个对象和对象组合。

模式类型:结构型模式

作用

  • 提供了一种统一的方式来访问树状结构中的各个节点。
  • 客户端代码不需要区分简单元素和复杂组合,能够以一致的方式处理它们。

典型应用场景

  • GUI控件嵌套结构(如窗口、面板等)
  • 文件和目录系统

我认为:通过使用组合模式,我们可以创建一个递归的对象结构,简化了客户端代码对复杂层次结构的操作。

课程目标

  • 理解组合模式的核心思想和经典应用场景
  • 识别应用场景,使用组合模式解决功能要求
  • 了解组合模式的优缺点

核心组件

角色-职责表

角色职责示例类名
Component定义参与组合对象的接口Component
Leaf表示叶子节点,没有子节点Leaf
Composite表示复合组件,包含子组件Composite

类图

透明组合模式类图:

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

安全组合模式类图:

«interface»
Component
+operation()
Leaf
-name: String
+operation()
Composite
-children: List
+add(Component)
+remove(Component)
+operation()

传统实现 VS 组合模式

案例需求

案例背景:构建一个简单的文件系统,其中包含文件和目录两种类型的节点。每个目录可以包含多个文件或其他目录。

传统实现(痛点版)

代码实现

// 传统写法代码片段
public class File {private String name;public File(String name) {this.name = name;}public void ls() {System.out.println(name);}
}public class Directory {private String name;private List<File> files = new ArrayList<>();public Directory(String name) {this.name = name;}public void add(File file) {files.add(file);}public void ls() {System.out.println(name);for (File file : files) {file.ls();}}
}

痛点总结

  • 需要为每种类型的节点编写不同的代码,难以维护。
  • 不支持多级的文件系统实现。

组合模式 实现(优雅版)

代码实现

// 模式写法代码片段
public abstract class Component {protected String name;public Component(String name) {this.name = name;}public abstract void ls();
}public class Leaf extends Component {public Leaf(String name) {super(name);}@Overridepublic void ls() {System.out.println(name);}
}public class Composite extends Component {private List<Component> children = new ArrayList<>();public Composite(String name) {super(name);}public void add(Component component) {children.add(component);}public void remove(Component component) {children.remove(component);}@Overridepublic void ls() {System.out.println(name);for (Component component : children) {component.ls();}}
}

优势

  • 提供了一致的接口,方便扩展和维护。
  • 支持任意层次的嵌套结构。

局限

  • 可能会导致过度设计,在简单场景下显得冗余。

模式变体

  • 透明组合模式:所有组件提供相同的方法集,包括那些仅对复合组件有意义的方法。
  • 安全组合模式:只有在适当的地方才提供方法,避免不必要的操作。但必须区分叶子构件和容器构件,不能保持组件的一致性。

透明组合模式优于安全组合模式,虽然在叶子构件中用add()或remove()会报错,但保持了组件一致性,便于进行抽象编程。


最佳实践

建议理由
尽量保持组件的一致性(透明组合模式)有助于简化客户端代码
考虑使用迭代器或访问者模式增强遍历能力提高灵活性和复用性

一句话总结

组合模式使我们能够以一致的方式处理简单和复杂的对象组合,简化了树状结构的管理。

如果关注Java设计模式内容,可以查阅作者的其他Java设计模式系列文章。😊

http://www.dtcms.com/a/330430.html

相关文章:

  • python的艺术品收藏管理系统
  • 数学建模层次分析法(AHP)笔记
  • C++入门自学Day11-- List类型的自实现
  • 2025天府杯数学建模B题分析
  • Vite 为什么比 Webpack 快?原理深度分析
  • Mac 新电脑安装cocoapods报错ruby版本过低
  • 一周学会Matplotlib3 Python 数据可视化-绘制面积图(Area)
  • 如何用aiohttp实现每秒千次的网页抓取
  • 机器视觉的磁芯定位贴合应用
  • PHP现代化全栈开发:实时应用与WebSockets实践
  • JVM字节码文件结构
  • PHP持久连接与普通连接的区别
  • 【大模型私有化部署】实战部分:Ollama 部署教程
  • 云蝠智能 VoiceAgent:重构物流售后场景的智能化引擎
  • Lua语言程序设计2:函数、输入输出、控制结构
  • 在CentOS系统中怎么查看Apache日志文件
  • Morph Studio-一站式AI视频创作平台
  • 亚马逊品牌权力重构:第三方卖家崛起下的竞争生态与系统性应对框架
  • AI引擎重构数据安全:下一代分类分级平台的三大技术跃迁
  • 从概率填充到置信度校准:GPT-5如何从底层重构AI的“诚实”机制
  • 深入解析 Chrome UI 布局配置的设计思想与实现机制
  • 快速搭建python HTTP Server测试环境
  • 18.13 《3倍效率提升!Hugging Face datasets.map高级技巧实战指南》
  • Docker部署美化SunPanel导航页
  • Keep-Alive 的 “爱情故事”:HTTP 如何从 “短命” 变 “长情”?
  • 【网络】HTTP总结复盘
  • 基于SpringBoot的救援物资管理系统 受灾应急物资管理系统 物资管理小程序
  • 37 C++ STL模板库6-string_view
  • springboot项目不同平台项目通过http接口AES加密传输
  • 深度学习-卷积神经网络CNN-批量归一化 BatchNorm