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

23种设计模式——组合模式(Composite Pattern) - 指南

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
个人主页:Meteors.的博客
当前专栏:设计模式
✨特色专栏:知识分享
本文内容:23种设计模式——组合模式(Composite Pattern)
** ps **  :阅读文章如果有挑战或者疑惑,欢迎在评论区提问或指出。


目录

一. 背景

二. 介绍

三. 核心概念

四. 代码示例

五. 特点

六. 适用场景

七. 最佳实践

八. 总结


一. 背景

组合,想必学过设计模式或者UML的都不陌生,不就一个类引用另一个类作为实例吗。不过加上模式二字,可能很多人就不知道了...不过我提醒你,存有许多文件的文件夹就是这种模式的标准案例,你的脑海中,就有一个大概的模型了。


二. 介绍

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示"部分-整体"的层次关系。此种模式使得客户端可以统一地处理单个对象和对象组合,而不需要区分它们是叶子节点还是组合节点。


三. 核心概念

组件接口(Component):定义树中对象的共同接口,行是抽象类或接口
叶子节点(Leaf):树中的终端节点,不包含子节点
复合节点(Composite):包含子节点的节点,实现组件接口并管理子节点


四. 代码示例

下面是一个使用了组合模式的文件夹demo:

import java.util.ArrayList;
import java.util.List;
// 1. 组件接口 (Component)
abstract class FileSystemComponent {protected String name;public FileSystemComponent(String name) {this.name = name;}public abstract void display(int depth);public abstract long getSize();
}
// 2. 叶子节点 (Leaf)
class File extends FileSystemComponent {private long size;public File(String name, long size) {super(name);this.size = size;}@Overridepublic void display(int depth) {System.out.println(" ".repeat(depth) + "- File: " + name + " (" + size + "KB)");}@Overridepublic long getSize() {return size;}
}
// 3. 复合节点 (Composite)
class Directory extends FileSystemComponent {private List children = new ArrayList<>();public Directory(String name) {super(name);}public void add(FileSystemComponent component) {children.add(component);}public void remove(FileSystemComponent component) {children.remove(component);}@Overridepublic void display(int depth) {System.out.println(" ".repeat(depth) + "+ Directory: " + name);for (FileSystemComponent component : children) {component.display(depth + 2);}}@Overridepublic long getSize() {long totalSize = 0;for (FileSystemComponent component : children) {totalSize += component.getSize();}return totalSize;}
}
// 使用示例
public class CompositePatternDemo {public static void main(String[] args) {// 创建文件File file1 = new File("file1.txt", 100);File file2 = new File("file2.jpg", 250);File file3 = new File("file3.pdf", 50);// 创建目录Directory root = new Directory("Root");Directory documents = new Directory("Documents");Directory images = new Directory("Images");// 构建树形结构root.add(documents);root.add(images);documents.add(file1);documents.add(file3);images.add(file2);// 显示文件系统结构root.display(0);// 计算总大小System.out.println("\nTotal size: " + root.getSize() + "KB");}
}


五. 特点

优点:

  • 统一处理单个对象和组合对象
  • 容易扩展和增加新的组件类型
  • 简化客户端代码,使其不需要区分个体和组合
  • 符合开闭原则

缺点:

  • 设计复杂,需要清晰定义组件接口
  • 难以限制容器中的构件类型
  • 不易用继承的方法来增加新的行为

六. 适用场景

  1. 表示对象的部分-整体层次结构
    • 文件系统、菜单系统、组织架构
    • 需要以树形结构表示的对象模型
  2. 希望用户忽略组合对象与单个对象的不同
    1. 客户端可以统一应用组合结构和单个对象
    2. 不想让客户端关注处理的是单个对象还是组合对象
  3. 结构具有递归特性
    1. UI界面组件(如Android的View和ViewGroup)
    2. XML/HTML文档结构
    3. 语法分析树

七. 最佳实践

明确组件接口:组件接口应该定义组合中所有对象的公共行为
合理处理异常:在Component中为叶子节点不支持的操作提供默认实现
考虑性能:对于大型树结构,避免深度递归操作
类型安全:能够通过泛型等方式增强类型安全性


八. 总结

组合模式是一种强大的设计模式,特有适合处理具有层次结构的对象。它经过将对象组织成树形结构,使得客户端可以统一处理个体对象和组合对象。在实际开发中,特别是在UI体系和树形数据结构处理中,组合模式得到了广泛应用。
当你需要表示对象的部分-整体层次结构,并希望用户忽略组合对象与单个对象的不同,可能考虑应用组合模式。这种模式能够简化客户端代码,提高系统的可扩展性和可维护性。


最后,

其它设计模式会陆续更新,希望文章对你有所协助!

http://www.jsqmd.com/news/6395/

相关文章:

  • 2025年破碎机厂家最新权威推荐榜:破碎机实力厂商技术服务全景评测及选购指南
  • 什么关系?就是ajax与jQuery
  • 完整教程:Redis数据结构和常用命令
  • 【光照】[PBR][法线分布]为何不选Beckmann
  • 2025标志牌生产厂家最新推荐排行榜:权威筛选优质标志牌品牌,助您精准选对交通标志牌,反光标志牌,道路标志牌供应商!
  • 2025 年脚手架厂家最新推荐榜:铝合金 / 盘扣 / 快装 / 移动式等多类型产品优选及国内实力企业排行指南
  • 2025年沈阳标识标牌厂家最新推荐榜单:涵盖订做标识标牌,广告标识标牌,安全出口标识标牌、不锈钢等多类型标识,全面解读企业产能与技术实力
  • 别再迷信甘特图了!90%的项目用它都错了
  • ZyperWin++使用教程!让Windows更丝滑!c盘飘红一键搞定!ZyperWin++解决系统优化、Office安装和系统激活
  • 完整教程:大模型浪潮下的“冷思考”:计算机视觉的变局与出路
  • 一文详解决策树:ID3与C4.5算法 - 详解
  • 玳瑁的嵌入式日记---0928(ARM--I2C) - 教程
  • 关于处理大批量数据下载和查询时,怎么进行限流和熔断处理(AI)
  • docker服务器运维
  • 详细介绍:Java数据结构第二十七期:布隆过滤器,用 “模糊” 换高效的查重黑科技
  • Nginx 反向代理与负载均衡核心内容总结 - 实践
  • 这款免费Windows优化神器!只有5M电脑绿色工具!ZyperWin++下载安装教程
  • 完整教程:Clustering|聚类
  • 深入解析:DAY 04 CSS文本,字体属性以及选择器
  • 原核蛋白表达与真核蛋白表达的差异选择
  • 【MacOS】彻底卸载Navicat
  • SpringAI 实战:解除 Netty 超时难题,优化 OpenAiApi 配置
  • 泛型类型参数
  • CF1584E Game with Stones 题解
  • 高德解包和打包报错
  • 用友U8Api 接口对接
  • JUC:AQS
  • CF1980F2 Field Division (hard version) 题解
  • JUC:ThreadLocal
  • 广义串并联图とP6790 [SNOI2020] 生成树