结构型模式-组合模式

组合模式(Composite Pattern)是一种结构型设计模式,它通过将对象组合成树形结构来表示“部分-整体”的层次结构,从而使客户端对单个对象和组合对象的使用具有一致性。

适用场景

  • 需要表示对象的层次结构:如文件系统、组织结构图等。
  • 客户端需要统一对待单个对象和组合对象:避免客户端分辨“这是一个简单对象”还是“这是一个复杂组合”。

主要角色

  • 抽象组件(Component)
    定义统一的接口或抽象类,为所有单个对象和组合对象提供公共操作。例如,定义通用操作方法,如add、remove和getChild。

  • 叶子节点(Leaf)
    表示树的叶子节点,无法继续包含子对象。实现抽象组件的操作。

  • 组合对象(Composite)
    表示可能包含子节点的复杂对象。它实现抽象组件,并持有子组件的集合。

  • 客户端(Client)
    通过抽象组件与对象交互,无需关心它是叶子节点还是组合对象。

示例代码

public abstract class Component {public void add(Component component) {throw new UnsupportedOperationException("不支持操作");}public void remove(Component component) {throw new UnsupportedOperationException("不支持操作");}public Component getChild(int i) {throw new UnsupportedOperationException("不支持操作");}public abstract void operation(); // 抽象方法
}
//叶子节点
public class Leaf extends Component {private String name;public Leaf(String name) {this.name = name;}@Overridepublic void operation() {System.out.println("执行叶子节点操作:" + name);}
}
//组合对象
import java.util.ArrayList;
import java.util.List;public class Composite extends Component {private List<Component> children = new ArrayList<>();@Overridepublic void add(Component component) {children.add(component);}@Overridepublic void remove(Component component) {children.remove(component);}@Overridepublic Component getChild(int i) {return children.get(i);}@Overridepublic void operation() {System.out.println("执行组合对象操作");for (Component child : children) {child.operation(); // 递归调用子对象的操作}}
}public class Client {public static void main(String[] args) {// 创建叶子节点Component leaf1 = new Leaf("Leaf1");Component leaf2 = new Leaf("Leaf2");// 创建组合对象Composite composite = new Composite();composite.add(leaf1);composite.add(leaf2);// 创建更大的组合Composite root = new Composite();root.add(composite);root.add(new Leaf("Leaf3"));// 执行操作root.operation();}
}

优缺点

  • 优点
    高扩展性:添加新的组件(叶子或组合)时无需修改现有代码。
    一致性:客户端代码可以一致地处理单个对象和组合对象。
  • 缺点
    可能影响性能:对于包含大量子对象的组合对象,操作时会递归调用。
    过于通用:可能导致组件类的接口过于庞大。
    这种模式在树形结构的处理中非常实用,尤其是对于递归操作和统一接口的需求场景,比如操作系统的文件系统、UI 组件树等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/62382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HOW - React 状态模块化管理和按需加载(二) - jotai

目录 一、背景二、jotai 介绍2.1 基本介绍Jotai 的核心特点在现有项目中使用 Jotai 的场景 2.1 jotai 使用安装 Jotai基本使用方法1. 创建 Atom&#xff08;状态单元&#xff09;2. 使用 Atom3. 全局共享状态 与 Ant Design 和 Redux 的结合1. 替代局部状态的 Redux 实现2. 与 …

基于FPGA的SD NAND读写测试(图文并茂+源代码+详细注释)

本实验所使用的源代码已同步至个人主页的资源处&#xff0c;可供读者自行学习...... 什么是SD NAND&#xff1f; 1.SD NAND 卡介绍 SD NAND 卡是一种基于 NAND 闪存技术的存储设备&#xff0c;其外观和接口类似于标准的 SD 卡。它将 NAND 闪存芯片和必要的控制电路集成在一个小…

机器学习6-梯度下降法

梯度下降法 目的 梯度下降法(Gradient Descent)是一个算法&#xff0c;但不是像多元线性回归那样是一个具体做回归任务的算法&#xff0c;而是一个非常通用的优化算法来帮助一些机器学习算法求解出最优解的&#xff0c;所谓的通用就是很多机器学习算法都是用它&#xff0c;甚…

(0基础保姆教程)-JavaEE开课啦!--11课程(初识Spring MVC + Vue2.0 + Mybatis)-实验9

一、什么是Spring MVC&#xff1f; Spring MVC 是一个基于 Java 的 Web 框架&#xff0c;遵循 MVC 设计模式&#xff0c;用于构建企业级应用程序。它通过控制器(Controller)处理用户请求&#xff0c;模型(Model)处理业务逻辑&#xff0c;视图(View)展示数据&#xff0c;实现了请…

微前端-MicroApp

微前端即是由一个主应用来集成多个微应用&#xff08;可以不区分技术栈进行集成&#xff09; 下面是使用微前端框架之一 MicroApp 对 react微应用 的详细流程 第一步 创建主应用my-mj-app 利用脚手架 npx create-react-app my-mj-app 快速创建 安装 npm install --save rea…

python画图plt.close()一直闪烁

解决方法&#xff1a; import matplotlib matplotlib.use(Agg) # 设置后端为 Agg 在Matplotlib中&#xff0c;’后端’&#xff08;backend&#xff09;指的是用于实际绘制图形的底层图形库。Matplotlib支持多种后端&#xff0c;如’TkAgg’、’Qt5Agg’、’WXAgg’等&…

知识库助手的构建之路:ChatGLM3-6B和LangChain的深度应用

ChatGLM3-6B和LangChain构建知识库助手 安装依赖库 使用pip命令安装以下库&#xff1a; pip install modelscope langchain0.1.7 chromadb0.5.0 sentence-transformers2.7.0 unstructured0.13.7 markdown3.0.0 docx2txt0.8 pypdf4.2.0依赖库简介&#xff1a; ModelScope&a…

MySQL中的count函数

1. COUNT() 是什么&#xff1f; 在 MySQL 中&#xff0c;COUNT() 是一个聚合函数&#xff0c;用于统计结果集中行的数量。它常见的几种用法包括&#xff1a; COUNT(*)&#xff1a;统计结果集中所有行的数量&#xff0c;包括包含 NULL 的行。COUNT(1)&#xff1a;统计结果集中所…

shell(2)永久环境变量和字符串显位

shell&#xff08;2&#xff09;永久环境变量和字符串显位 声明&#xff01; 学习视频来自B站up主 ​泷羽sec​​ 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习…

基于pytorch使用仿真数据集来训练一个深度学习模型进行相位解包裹

使用 PyTorch 来训练一个深度学习模型进行相位解包裹是一种常见的方法。下面是一个详细的示例&#xff0c;展示如何生成仿真数据集并在 PyTorch 中训练模型。 1. 生成仿真数据集 首先&#xff0c;我们生成一些仿真数据集&#xff0c;包含多个包裹相位图和对应的解包裹相位图。…

使用 Python 的 pdfplumber 库高效解析 PDF 文件

使用 Python 的 pdfplumber 库高效解析 PDF 文件 PDF 文件是日常办公和数据处理中常见的文件格式&#xff0c;而 pdfplumber 是一个专为 PDF 文件解析设计的 Python 库&#xff0c;可以轻松提取文本、表格、图像等内容。本文将介绍 pdfplumber 的基本功能、使用方法&#xff0…

Java实现IP代理池

文章目录 Java实现IP代理池一、引言二、构建IP代理池1、代理IP的获取2、代理IP的验证1. 导入必要的库2. 设置代理IP和端口3. 发起HTTP请求4. 检查请求结果5. 完整的验证方法 注意事项 三、使用IP代理池四、总结 Java实现IP代理池 一、引言 在网络爬虫或者需要频繁请求网络资源…

微服务保护和分布式事务

文章目录 一、微服务保护1.1 微服务保护方案&#xff1a;1.1.1 请求限流&#xff1a;1.1.2 线程隔离&#xff1a;1.1.3 服务熔断&#xff1a; 1.2 Sentinel&#xff1a;1.2.1 介绍和安装&#xff1a;1.2.2 微服务整合&#xff1a; 1.3 请求限流&#xff1a;1.4 线程隔离&#x…

后端 Java发送邮件 JavaMail 模版 20241128测试可用

配置授权码 依赖 <dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId><version>1.5.5</version> </dependency> <dependency><groupId>com.sun.mail</groupId><artifa…

MySQL安装与卸载(linux)

MySQL安装与卸载 MySQL8.0.26-安装1. 准备一台Linux服务器2. 下载Linux版MySQL安装包3. 上传MySQL安装包4. 创建目录,并解压5. 安装mysql的安装包6. 启动MySQL服务7. 查询自动生成的root用户密码8. 修改root用户密码9. 创建用户10. 并给root用户分配权限11. 重新连接MySQL MySQ…

LayaBox1.8.4实现自定义3DMesh

实现mesh的原理可参考我写的Unity中的自定义mesh的原理&#xff0c; 碰撞检测算法——分离轴算法在Unity中实现&#xff08;一&#xff09;_unity 自定义高性能碰撞检测方案-CSDN博客 实现可传入shader两张贴图的顶点声明如下&#xff1a; var vertexDeclarationLaya.Vertex…

设置ip和代理DNS的WindowsBat脚本怎么写?

今天分享一个我们在工作时&#xff0c;常见的在Windows中通过批处理脚本&#xff08;.bat 文件&#xff09;来设置IP地址、代理以及DNS 相关配置的示例&#xff0c;大家可以根据实际需求进行修改调整。 一、设置静态IP地址脚本示例 以下脚本用于设置本地连接&#xff08;你可…

施工车辆,工程车类型识别,可识别装载机,搅拌车,挖掘机,拉土车等,支持YOLO,COCO,VOC三种格式带标记

1338总图像数 数据集分割 训练组 87&#xff05; 1170图片 有效集 8% 112图片 测试集 4% 56图片 预处理 自动定向&#xff1a; 已应用 调整大小&#xff1a; 拉伸至 640x640 增强 每个训练示例的输出&#xff1a; 3 旋转&#xff1a; -15 至 15 之间 …

oracle 用户手册

Oracle用户手册 一、Oracle数据库概述 定义与用途 Oracle数据库是一款功能强大的关系型数据库管理系统(RDBMS)。它用于存储和管理大量的结构化数据,广泛应用于企业级应用、金融系统、电商平台等各种需要高效数据处理和存储的场景。例如,银行使用Oracle数据库来存储客户账户…

新版布谷直播软件源码开发搭建功能更新明细

即将步入2025年也就是山东布谷科技专注直播系统开发,直播软件源码出售开发搭建等业务第9年,山东布谷科技不断更新直播软件功能&#xff0c;以适应当前新市场环境下的新要求。山东布谷科技始终秉承初心&#xff0c;做一款符合广大客户需求的直播系统软件。支持广大客户提交更多个…