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

结构型:组合模式

目录

1、核心思想

2、实现方式

2.1 模式结构

2.2 实现案例

3、优缺点分析

4、适用场景


1、核心思想

目的:将总是在重复、迭代地显示的某种自相似性的结构(部分与整体结构特征相似),例如树形结构,以统一的方式处理单个对象和对象组合,最终达到对象复杂的层次结构与客户端解耦的目的。

解决思路:用组合模式来表达“部分/整体”的层次结构,提取并抽象其相同的部分,特殊化其不同的部分,以提高系统的可复用性与可扩展性,最终达到以不变应万变的目的。

举例

1> 蕨类植物的叶子,不管从哪个层级观察这片叶子,我们都会得到一个固定的结构,这意味着组成植物叶子的部分或整体都有着相同的生长方式。

2> 二叉树,此结构始于其开端的“根”节点,往下分出来两个“枝”节点(左右2个节点)​,接着每个枝节点又可以继续“分枝”​,直至其末端的“叶”节点为止。

2、实现方式

2.1 模式结构

三个核心结构:

  • Component(组件接口)​:所有复合节点与叶节点的高层抽象,定义出需要对组件操作的接口标准(声明管理子组件的方法(如透明模式)或仅定义公共行为(如安全模式))。
  • Composite(复合组件)​:包含多个子组件对象(List<Node>,可以是复合组件或叶端组件)的复合型组件,负责管理子组件(添加、删除、遍历),并委托操作到所有子节点。
  • Leaf(叶端组件)​:不包含子组件的终端组件,同样实现组件接口中定义的操作方法。通常不实现子组件管理方法(如add),若数据接口标准,可抛出异常。

2.2 实现案例

文件系统:文件系统由文件和文件夹构成,文件夹可包含文件或其他文件夹(tree);可以层级打印文件结构(tree)。

// 组件接口
public abstract class Node {protect String name;//节点命名public Node(String name) {//构造方法需传入节点名this.name = name;}//增加后续子节点方法public abstract void add(Node child);public void tree(int space) {for(int i=0; i < space; i++) {System.out.print(" ");//先循环输入space个空格}System.out.println(name);//接着再输出自己的名字}//无参重载方法,默认从第0列开始展示public void tree() {this.tree(0);}
}// 组合:文件夹
class Folder implements Node{// 文件夹可以包含子节点(子文件夹或文件)private List<Node> children = new ArrayList<>();public Folder(String name) { super(name);// 调用父类“节点”的构造方法命名}public void add(Node child) {children.add(child);//可以添加子节点}@Overridepublic void tree() {super.tree(space); //调用父类通用的tree方法列出自己的名字space++; //在循环的子节点前,空格数要加1for (Node child: children) {child.tree(); // 调用子节点的tree方法}}
}// 叶子:文件
class File implements Node{public File(String name)  { super(name);}public void add(Node child) {System.out.println("不能添加子节点");}@Overridepublic void tree() {super.tree(space);}
}// 客户端调用
public class Client {public static void main(String[] args) {Folder root = new Folder("D盘");root.add(new File("简历.pdf"));Folder subFolder = new Folder("图片");subFolder.add(new File("1.jpg"));subFolder.add(new File("2.png"));root.add(subFolder);root.tree();}
}

3、优缺点分析

优点:

  • 统一处理:客户端无需区分叶子节点和组合节点。

  • 扩展性强:新增组件类型无需修改现有代码,符合开闭原则。

  • 树形结构支持:天然适合递归和层次化数据管理。

缺点:

  • 接口设计挑战

    • 透明模式:叶子需实现不相关方法(如add),可能抛出异常。

    • 安全模式:客户端需类型检查,失去透明性。

  • 性能开销:递归遍历可能影响性能(深层次结构)。

4、适用场景

  • 树形结构表示:文件系统、菜单/子菜单、组织架构。

  • 递归操作需求:统计目录大小、渲染UI组件树。

  • 统一处理逻辑:对单个对象和组合对象执行相同操作(如复制、删除)。

相关文章:

结构型:组合模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 1、核心思想 目的&#xff1a;将总是在重复、迭代地显示的某种自相似性的结构&#xff08;部分与整体结构特征相似&#xff09;&#xff0c;例如树形结构&#xff0c;以统一的方式处…...

windows 删除文件夹提示“操作无法完成,因为其中的文件夹或文件已在另一程序中打开”

windows 删除文件夹提示“操作无法完成&#xff0c;因为其中的文件夹或文件已在另一程序中打开” tomact已经关闭了&#xff0c;刚开始怀疑是tomcat关闭不彻底&#xff0c;但是任务管理器–》进程里根本没有java的进程了&#xff0c;由于是医院服务器、不方便重启 解决方法&am…...

使用 electron-builder 打包与发布 Electron 应用

基于 electron-vite-vue 项目结构 本文将基于 electron-vite-vue 脚手架&#xff0c;详细介绍如何使用 electron-builder 实现&#xff1a; ✅ 多平台打包&#xff08;Windows / macOS / Linux&#xff09;✅ 自动更新发布配置✅ 常用构建脚本与输出结构 &#x1f4c1; 项目结…...

微信小程序中,解决lottie动画在真机不显示的问题

api部分 export function getRainInfo() {return onlineRequest({url: /ball/recruit/getRainInfo,method: get}); }data存储json数据 data&#xff1a;{rainJson:{} }onLoad方法获取json数据 onLoad(options) {let that thisgetRainInfo().then((res)>{that.setData({r…...

Wireshark 抓包工具使用

1.下载地址 https://2.na.dl.wireshark.org/win64/ 或者 Wireshark Go Deep 2.安装并打开 3.电脑设置热点&#xff0c;手机连接热点 4.手机发起网络请求&#xff0c;工具上选择WLAN。或者本地连接 5.点击查看抓包数据&#xff0c;过滤。最好用发送端ip过滤&#xff0c;s…...

大语言模型(LLM)本身是无状态的,怎么固化记忆

大语言模型(LLM)本身是无状态的,无法直接“记住”历史对话或用户特定信息 大语言模型(LLM)本身是无状态的,无法直接“记住”历史对话或用户特定信息,但可以通过架构改进、外部记忆整合、训练方法优化等方案实现上下文记忆能力。 一、模型内部记忆增强:让LLM“记住”…...

JUC入门(六)

12、四大函数式接口 Consumer<T>&#xff08;消费者接口&#xff09; 源码 功能 接收一个参数T&#xff0c;不返回任何结果。主要用于消费操作&#xff0c;例如打印日志、更新状态等。 使用场景 遍历集合并执行操作。 对象的字段赋值。 代码示例 import java.util.…...

std::chrono类的简单使用实例及分析

author: hjjdebug date: 2025年 05月 20日 星期二 14:36:17 CST descrip: std::chrono类的简单使用实例及分析 文章目录 1.实例代码:2. 代码分析:2.1 auto t1 std::chrono::high_resolution_clock::now();2.1.1 什么是 system_clock2.1.2 什么是 chrono::time_point?2.1.3 什…...

Git命令汇总(自用,持续更新update 5/23)

文章目录 Git常见命令1. 推送空提交2. 提交Clean-PR3. 回退add操作4. 交互式rebase4.1 切换模式4.2 保存与退出4.3 注意Rebase 5. 合并多个commit 问题一&#xff1a;Clone Github报错The TLS connection was non-properly terminated.TLS握手报错原因解决 问题二&#xff1a;F…...

window xampp apache使用腾讯云ssl证书配置https

下载腾讯云ssl证书&#xff1a; 编辑Apache根目录下 conf/httpd.conf 文件&#xff1a; #LoadModule ssl_module modules/mod_ssl.so和#Include conf/extra/httpd-ssl.conf&#xff0c;去掉前面的#号注释。 编辑Apache根目录下 conf/httpd-ssl.conf 文件&#xff1a; <Vi…...

MATLAB求解二元一次方程组基础教程

MATLAB求解二元一次方程组基础教程 一、二元一次方程组简介 二元一次方程组是包含两个未知数(x和y)的一组方程&#xff0c;每个方程中未知数的最高次数为1。一般形式为&#xff1a; a₁x b₁y c₁ a₂x b₂y c₂其中a₁, b₁, c₁, a₂, b₂, c₂为已知系数。 二、MATL…...

Android13 wifi设置国家码详解

Android13 wifi设置国家码详解 文章目录 Android13 wifi设置国家码详解一、前言二、设置wifi国家码相关代码1、adb或者串口也能设置和获取当前国家码&#xff08;1&#xff09;查询命令的方式&#xff08;2&#xff09;获取和设置国家码的示例 2、Java代码设置国家码3、获取当前…...

逆向音乐APP:Python爬虫获取音乐榜单 (1)

1. 引言 在数字音乐时代&#xff0c;许多平台如音乐有榜单&#xff0c;限制非付费用户访问高音质或独家内容。然而&#xff0c;从技术研究的角度来看&#xff0c;我们可以通过逆向工程和Python爬虫技术解音乐的API接口&#xff0c;获取付费音乐的播放链接。 2. 技术准备 在当…...

JVM 垃圾回收器

以下是对主流 JVM 垃圾回收器的详细解析&#xff0c;涵盖 一、Serial GC&#xff08;单线程串行回收器&#xff09; 二、Parallel GC&#xff08;吞吐量优先回收器&#xff09; 三、CMS&#xff08;Concurrent Mark Sweep&#xff0c;低延迟回收器&#xff09; 四、G1&…...

Java合并两个列表到目标列表,并且进行排序

可以通过使用addAll()方法将两个列表合并到目标列表中。以下是实现代码&#xff1a; java 复制 下载 List<LedgerRecord> rkRecordList warehouseMapper.selectLedgerRkRecordByMaterialNo(materialNo); List<LedgerRecord> ckRecordList warehouseMapper.se…...

Spring AI Alibaba集成阿里云百炼大模型应用

文章目录 1.准备工作2.引入maven依赖3.application.yml4.调用4.1.非流式调用4.2.流式调用 阿里云百炼推出的智能体应用、工作流应用和智能体编排应用&#xff0c;有效解决了大模型在处理私有领域问题、获取最新信息、遵循固定流程以及自动规划复杂项目等方面的局限&#xff0c;…...

22. 用例依赖装饰器的实现思路和方法

22. 用例依赖装饰器的实现思路和方法 一、核心功能解析 1.1 实现目标 depend(casetest_login) # 当test_login失败时跳过当前测试 def test_order(self):pass功能特性&#xff1a; 前置依赖检测自动跳过失效用例异常依赖关系校验实时结果分析 二、代码逐行解析 2.1 自定义…...

支持向量存储:PostgresSQL及pgvector扩展详细安装步骤!老工程接入RAG功能必备!

之前文章和大家分享过&#xff0c;将会出一篇专栏&#xff08;从电脑装ubuntu系统&#xff0c;到安装ubuntu的常用基础软件&#xff1a;jdk、python、node、nginx、maven、supervisor、minio、docker、git、mysql、redis、postgresql、mq、ollama等&#xff09;&#xff0c;目前…...

【部署】如何离线环境创建docker容器执行python命令行程序

回到目录 【部署】如何离线环境创建docker容器执行python命令行程序 本文以 dify_import项目为例&#xff0c;讲解如何在离线服务器上&#xff0c;搭建docker容器环境&#xff0c;执行python命令行程序 1. 一台有互联网的服务器(ubuntu24.04) 1.1. 拉取一个ubuntu的docker镜…...

idea常用配置 properties中文输出乱码

propertis配置中文乱码 源码和编译后的都是中文 程序输入效果 idea配置3处 程序输出效果 自定义注释模板 IDEA 中有以下两种配置模板。 File and Code Templates Live Templates File and Code Templates File and Code Templates 用来配置文件和代码模板&#xff0c;即…...

【Bluedroid】蓝牙 HID Host connect全流程源码解析

蓝牙 HID(Human Interface Device,人机接口设备)是智能设备与外设(如键盘、鼠标、游戏手柄)交互的核心协议。本文围绕Android蓝牙 HID 主机模块的连接流程,从上层应用发起连接请求开始,逐层解析协议栈内部的状态检查、设备管理、SDP 服务发现、L2CAP 通道建立等关键步骤…...

day1 大模型学习 Qwen系列学习

Qwen 模型学习笔记:RM、SFT 与 RLHF 技术解析 一、Qwen 模型概述 Qwen 是阿里巴巴开源的大型语言模型系列,旨在实现通用人工智能(AGI)。其架构包括基础语言模型(如 Qwen-7B、Qwen-14B、Qwen-72B)和经过后训练的对话模型(如 Qwen-Chat)。后训练主要通过 SFT 和 RLHF 技…...

Unity3D仿星露谷物语开发47之砍树时落叶特效

1、目标 当橡树被砍伐时的落叶粒子效果。 2、创建粒子物体 Hierarchy -> PersistentScene下创建新物体命名为DeciduousLeavesFalling。 添加Particle System组件。 基础配置如下&#xff1a;&#xff08;暂时勾选Looping实时可以看生成效果&#xff0c;后面反选即可&am…...

第十节第六部分:常见API:DateTimeFormatter、Period、Duration

DateTimeFormatter类常用方法 Period类常用方法 Duration类常用方法 总结 代码&#xff1a; 代码一&#xff1a;DateTimeFormatter类常用方法 package com.itheima.jdk8_time;import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class DateT…...

如何在VSCode中更换默认浏览器:完整指南

引言 作为前端开发者&#xff0c;我们经常需要在VSCode中快速预览HTML文件。默认情况下&#xff0c;VSCode会使用系统默认浏览器打开文件&#xff0c;但有时我们可能需要切换到其他浏览器进行测试。本文将详细介绍如何在VSCode中更换默认浏览器。 方法一&#xff1a;使用VSCo…...

B2160 病人排队

题目描述 编写一个程序,将登记的病人按照以下原则排出看病的先后顺序: 老年人(年龄 ≥60 岁)比非老年人优先看病。老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。非老年人按登记的先后顺序看病。输入格式 第 1 行,输入一个小于 100 的正整数,表示病人…...

【机器人】复现 3D-Mem 具身探索和推理 | 3D场景记忆 CVPR 2025

3D-Mem 是用于具体探索和推理的3D场景记忆&#xff0c;来自CVPR 2025. 本文分享3D-Mem复现和模型推理的过程&#xff5e; 下面是一个推理和选择识别的结果&#xff1a; 看一下机器人探索的效果&#xff1a; 下面是真实环境下&#xff0c;官方跑的demo&#xff0c;3D-Mem无需训…...

鸿蒙进阶——CMakelist、GN语法简介及三方库通用移植指南

文章大纲 引言一、GN常用的内置变量二、GN常用的内置函数三、CMake 重要语法1、生成动态库2、生成静态库3、生成OBJECT 库4、重要的函数和模块4.1、add_definitions4.2、execute_process4.3、add_dependencies4.4、install4.5、FetchContent 四、GN 重要语法1、编译Target2、预…...

CSS-5.1 Transition 过渡

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点…...

TTS:VITS-fast-fine-tuning 快速微调 VITS

1&#xff0c;项目概述 VITS是一种语音合成的方法&#xff0c;是一个完全端到端的TTS 模型&#xff0c;它使用预先训练好的语音编码器将文本转化为语音&#xff0c;并且是直接从文本到语音波形的转换&#xff0c;无需额外的中间步骤或特征提取。 VITS的工作流程为&#xff1a;…...