【设计模式-组合】

**Composite Pattern(组合模式)**是一种结构型设计模式,旨在将对象组合成树形结构,以表示“部分-整体”的层次结构。这种模式允许客户端以统一的方式处理单个对象和对象集合,从而简化了树形结构的处理。

核心思想

组合模式通过将对象和组合对象(即子对象)封装在统一的接口中,使得客户端可以以一致的方式处理这些对象。这样,无论是处理单个对象还是处理由多个对象组成的集合,客户端的操作都不会改变。

组成部分

  • Component(组件): 这是一个接口或抽象类,声明了叶子节点和复合节点的共同操作接口。例如,它可能声明了 add, remove, getChild, 和其他一些操作。

  • Leaf(叶子节点): 叶子节点实现了 Component 接口,并定义了叶子节点特有的行为。叶子节点是树形结构中的末端元素,不能有子节点。

  • Composite(复合节点): 复合节点也实现了 Component 接口,维护了一个子组件的集合,并定义了对这些子组件的操作方法(如 add, remove, getChild)。复合节点可以包含叶子节点或其他复合节点。

UML图

在这里插入图片描述

Java代码

以下是一个简单的示例,展示了如何在 Java 中实现组合模式。这个示例构建了一个文件系统的树形结构,其中包含文件和文件夹(文件夹可以包含其他文件夹和文件)。

import java.util.ArrayList;
import java.util.List;// Component
interface FileSystemComponent {void print(String indent);
}// Leaf
class File implements FileSystemComponent {private String name;public File(String name) {this.name = name;}@Overridepublic void print(String indent) {System.out.println(indent + "File: " + name);}
}// Composite
class Folder implements FileSystemComponent {private String name;private List<FileSystemComponent> children = new ArrayList<>();public Folder(String name) {this.name = name;}public void add(FileSystemComponent component) {children.add(component);}public void remove(FileSystemComponent component) {children.remove(component);}public FileSystemComponent getChild(int index) {return children.get(index);}@Overridepublic void print(String indent) {System.out.println(indent + "Folder: " + name);for (FileSystemComponent child : children) {child.print(indent + "  ");}}
}// Client
public class CompositePatternExample {public static void main(String[] args) {FileSystemComponent file1 = new File("file1.txt");FileSystemComponent file2 = new File("file2.txt");Folder folder1 = new Folder("folder1");Folder folder2 = new Folder("folder2");folder1.add(file1);folder1.add(folder2);folder2.add(file2);Folder rootFolder = new Folder("root");rootFolder.add(folder1);rootFolder.print("");}
}

解释

  • Component(FileSystemComponent): 这是一个接口,定义了所有文件系统组件的公共操作方法 print,用于输出组件信息。

  • Leaf(File): 实现了 FileSystemComponent 接口,表示文件。文件具有一个名称,并且可以输出自身的信息。

  • Composite(Folder): 也实现了 FileSystemComponent 接口,表示文件夹。文件夹可以包含其他文件夹或文件,并且能够递归地打印所有子组件的信息。

优点

  1. 一致的接口: 组合模式提供了一个统一的接口,客户端无需关心对象的具体类型,无论是处理单一对象还是对象组合,使用方式相同。

  2. 易于扩展: 新的叶子节点或复合节点可以很容易地加入现有系统中,而不需要修改现有的代码。

  3. 简化客户端代码: 客户端代码可以用相同的方式处理单个对象和对象组合,简化了操作和维护。

缺点

  1. 设计复杂: 组合模式可能会导致设计复杂,因为需要处理递归结构以及可能需要大量的子类。

  2. 性能开销: 在处理复杂的树形结构时,可能会有较大的性能开销,特别是在树的深度很大时。

使用场景

  • 文件系统: 典型的应用场景,如文件和文件夹的组织结构。
  • 图形用户界面(GUI): GUI 元素如按钮、面板和对话框可以通过组合模式进行管理。
  • 组织结构: 处理公司或团队的组织结构图。

组合模式通过将对象结构建模为树形结构,使得客户端能够以一致的方式处理各种对象,尤其适合处理层次结构问题。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LLM应用实战: 文档问答系统Kotaemon-1. 简介及部署实践

1.背景 本qiang~这两周关注到一个很火的开源文档问答系统Kotaemon&#xff0c;从8月28日至今短短两周时间&#xff0c;github星标迅猛增长10K&#xff0c;因此计划深挖一下其中的原理及奥秘。 本篇主要是Kotaemon的简介信息&#xff0c;涉及到主要特点&#xff0c;与传统文档…

MindShare PCIE 3.0 笔记-第一二章

MindShare 官网&#xff0c;地址如下: MindShare Chapter 1&#xff1a;PCIE 背景介绍 - PCI 总线模型 1. 以 PCI 总线作为外设总线的 SOC 芯片架构 下图展示了一个以 PCI 总线作为外设总线的 SOC 芯片架构(PCI 总线类似 AXI 下的 AHB&#xff1f;)&#xff1a; 由上图可知…

虚拟机与物理机的文件共享

之前往虚拟机里传文件都是直接拖拽或者借助工具上传&#xff0c;都不太方便&#xff0c;倘若物理机的文件直接能在虚拟机里读取使用&#xff0c;那多好啊~ 1 虚拟机设置 注意文件夹名称不要中文/空格 2 验证Kali下分享文件夹功能是否启用 vmware-hgfsclient 3 创建挂载目录…

数据库基础知识---------------------------(2)

MYSQL的存储过程 就是数据库 SQL 语言层面的代码封装与重用 语法格式 delimiter 自定义结束符号 create procedure 存储名({in,out,inout} 参数名,数据类型...) begin sql 语句 end 自定义结束符 delimiter; 变量定义 局部变量 用户自定义 仅在begin / end 块中有效 当将查询…

apach httpd多后缀解析漏洞

漏洞详情&#xff1a; httpd支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。 那么&#xff0c;在有多个后缀的情况下&#xff0c;只要一个文件含有.php后缀的文件即将被识别成PHP文件&#xff0c;没必要是最后一个后缀。 利用这个特性&#xff0c;可以绕过…

Linux硬连接、软连接和复制的区别

‌硬连接、软连接和复制在Linux系统中的主要区别体现在以下三点&#xff1a; 文件链接的方式文件独立性文件系统的操作上。‌ 一、硬连接 1. 硬连接是通过ln命令创建的&#xff0c;它为文件创建别名&#xff0c;与源文件共享同一inode号码&#xff0c;因此硬连接和源文件实际…

Mint Expedition Season 3 拉开帷幕:登顶高峰的时刻到了

自 7 月 15 日 Mint Expedition 启动以来&#xff0c;Mint&#xff0c;一条专注于 NFT 行业的以太坊 Layer 2&#xff0c;日常交易量和交易额都出现了爆发式增长。这一成功离不开 Mint 社区的合作&#xff0c;包括 Minters、Web3 去中心化应用程序的开发者&#xff0c;以及大量…

02 ETH

以太坊与比特币有什么不同&#xff1f; 以太坊立足比特币创新之上&#xff0c;于 2015 年启动&#xff0c;两者之间有一些显著不同。 比特币就仅仅是比特币&#xff1b;以太坊包括以太币&#xff0c;以太币才是和比特币对等的存在。以太坊是可编程的&#xff0c;所以你可以在…

示例:WPF中Grid显示网格线的几种方式

一、目的&#xff1a;介绍一下WPF中Grid显示网格线的几种方式 二、几种方式 1、重写OnRender绘制网格线&#xff08;推荐&#xff09; 效果如下&#xff1a; 实现方式如下&#xff1a; public class LineGrid : Grid{protected override void OnRender(DrawingContext dc){Pen…

SQL 多表联查

目录 1. 内联接&#xff08;INNER JOIN&#xff09; 2. 左外联接&#xff08;LEFT JOIN&#xff09; 3. 右外联接&#xff08;RIGHT JOIN&#xff09; 4. 全外联接&#xff08;FULL JOIN&#xff09; 5. 交叉联接&#xff08;CROSS JOIN&#xff09; 6. 自联接&#xff0…

MATLAB系列07:稀疏矩阵、单元阵列和结构

MATLAB系列07&#xff1a;稀疏矩阵、单元阵列和结构 7. 稀疏矩阵、单元阵列和结构7.1 稀疏矩阵7.1.1 sparse数据类型7.1.1.1 产生稀疏矩阵7.1.1.2 稀疏矩阵的运算 7.2 单元阵列(cell array)7.2.1 创建单元阵列7.2.1.1 用赋值语句创建单元阵列7.2.1.2 用cell函数创建单元阵列 7.…

Day02Day03

1. 为什么拦截器不会去拦截/admin/login上&#xff0c;是因为在SpringMvc中清除了这种可能。 2.使用自己定义注解&#xff0c;实现AOP&#xff08;insert ,update&#xff09; 3.使用update最好使用动态语句&#xff0c;可以使用多次 4.使用阿里云的OSS存储。用common类 5.在写…

【BoF】《Bag of Freebies for Training Object Detection Neural Networks》

arXiv-2019 https://github.com/dmlc/gluon-cv 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Visually Coherent Image Mixup for Object Detection4.2 Classification Head Label Smoothing4.3 Data Preprocessing4.4 Traini…

[Redis][Redis简介]详细讲解

目录 1.认识 Redis2.Redis 特性1.速度快2.基于键值对的数据结构的服务器3.丰富的功能4.简单稳定5.客户端语言多6.高扩展性7.持久化(Persistence)8.主从复制9.⾼可⽤和分布式 3.Redis 使用场景1.数据库2.Cache3.消息队列 4.注意 1.认识 Redis Redis是⼀种基于键值对(Key-Value)…

Why Is Prompt Tuning for Vision-Language Models Robust to Noisy Labels?

文章汇总 本文的作者针对了提示学习的结构设计进行了分析&#xff0c;发现了一些规律&#xff1a; 1)固定的类名令牌为模型的优化提供了强正则化&#xff0c;减少了由噪声样本引起的梯度。 2)从多样化和通用的web数据中学习到的强大的预训练图像文本嵌入为图像分类提供了强大…

ARM总复习

1.计算机的组成 输入设备 输出设备 存储设备 运算器 控制器、总线 2.指令和指令集 2.1 机器指令 机器指令又叫机器码&#xff0c;在运算器内部存在各种运算电路&#xff0c;当处理器从内存中获取一条机器指令&#xff0c;就可以按照指令让运算器内部的指定的运算电路进行运…

百度智能云SSL证书安装指南

第一步&#xff1a;准备SSL证书 在华测ctimall&#xff08;https://www.ctimall.com/ssl&#xff09;申请SSL证书后&#xff0c;您会收到一个包含多种证书格式的压缩文件。请解压此文件&#xff0c;并找到Nginx目录中的证书文件&#xff0c;因为这是百度智能云中需要用到的证书…

Hadoop的一些高频面试题 --- hdfs、mapreduce以及yarn的面试题

文章目录 一、HDFS1、Hadoop的三大组成部分2、本地模式和伪分布模式的区别是什么3、什么是HDFS4、如何单独启动namenode5、hdfs的写入流程6、hdfs的读取流程7、hdfs为什么不能存储小文件8、secondaryNameNode的运行原理9、hadoop集群启动后离开安全模式的条件10、hdfs集群的开机…

九章云极DataCanvas公司荣获2024年服贸会“科技创新服务示范案例”

9月15日&#xff0c;2024年中国国际服务贸易交易会&#xff08;服贸会&#xff09;示范案例交流会暨颁奖典礼在北京国家会议中心举行&#xff0c;九章云极DataCanvas 公司自研的DataCanvas Alaya NeW智算操作系统凭借卓越的AI创新实力、前瞻性的市场布局以及突破性的技术革新成…

pc端的屏保实现

背景 偶然间&#xff0c;在使用一款google插件的时候&#xff0c;发现它有一个小功能&#xff0c;只要我停留在它的页面不操作10分钟以上&#xff0c;就会自动给我打开一个屏保界面&#xff0c;这样的 目的 这种华而不实的功能&#xff0c;正好适合个人博客&#xff0c;所以…