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

结构型:组合模式

目录

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;以统一的方式处…...

Node.js多版本安装工具NVM详细使用教程

一、nvm 简介 nvm&#xff08;Node Version Manager&#xff09;是一个用于管理多个 Node.js 版本的命令行工具&#xff0c;允许开发者在单个系统中轻松切换、安装和卸载不同版本的 Node.js。它是前端和后端开发中处理 Node.js 版本兼容性问题的核心工具之一。 二、nvm 安装 …...

深度解析 Java 中介者模式:重构复杂交互场景的优雅方案

一、中介者模式的核心思想与设计哲学 在软件开发的历史长河中&#xff0c;对象间的交互管理一直是架构设计的核心难题。当多个对象形成复杂的网状交互时&#xff0c;系统会陷入 "牵一发而动全身" 的困境。中介者模式&#xff08;Mediator Pattern&#xff09;作为行…...

(八)深度学习---计算机视觉基础

分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.图像数字化表示及建模基础 二.卷积神经网络CNN基本原…...

深入剖析原型模式:原理、实现与应用实践

在软件开发的世界里,设计模式如同建筑师手中的蓝图,为复杂系统的构建提供了行之有效的解决方案。其中,原型模式(Prototype Pattern)作为创建型设计模式的重要一员,以其独特的对象创建方式,在提高代码复用性、增强系统灵活性等方面发挥着关键作用。本文将深入剖析原型模式…...

【论文阅读 | CVPR 2024 |RSDet:去除再选择:一种用于 RGB - 红外目标检测的由粗到精融合视角】

论文阅读 | CVPR 2024 |RSDet:去除再选择&#xff1a;一种用于 RGB - 红外目标检测的由粗到精融合视角 1.摘要&&引言2. 方法2.1 “由粗到细”融合策略2.2 冗余光谱去除模块&#xff08;RSR&#xff09;2.3 动态特征选择模块&#xff08;DFS&#xff09;2.4 去除与选择检…...

WinForms 应用中集成 OpenCvSharp 实现基础图像处理

引言 欢迎关注dotnet研习社&#xff0c;今天我们要讨论的主题是WinForms 应用中集成 OpenCvSharp 实现基础图像处理。 在常规的图像处理软件开发中&#xff0c;图像处理功能是这些应用程序的核心组成部分。无论是简单的照片编辑工具&#xff0c;还是复杂的计算机视觉应用&…...

apache http client连接池实现原理

在java开发中我们经常会涉及到http 请求接口&#xff0c;一般有几种方式&#xff1a; java自带的 HttpURLConnectionokHttpClientapache http client 一般我们使用apache http client会比较多点&#xff0c;在代码中会进行如下调用方式&#xff1a; private static class Htt…...

adb抓包

目录 抓包步骤 步骤 1: 获取应用的包名 步骤 2: 查看单个应用的日志 步骤 3: 使用日志级别过滤器 步骤 4: 高级日志过滤 可能的原因&#xff1a; 解决方案&#xff1a; 额外提示&#xff1a; 日志保存 抓包步骤 连接设备 adb devices 步骤 1: 获取应用的包名 首先…...

C语言---结构体 、联合体、枚举

一、初识结构体 1、结构体类型 结构体和数组都是集合&#xff0c;但是结构体有成员&#xff0c;类型可以不同&#xff1b;数组有成员&#xff0c;类型相同。 int main() {struct tag{member--list //一个或者多个成员&#xff0c;成员变量}variable--list;//可以省略&#x…...

Web Workers 使用指南

文章目录 前言基础使用高级特性 使用 ES Modules实际应用场景图像处理大数据处理轮询任务 性能优化技巧现代开发方式使用 worker-loader (Webpack) Vite中的Worker使用 限制与注意事项DOM限制:通信限制:同源策略:最佳实践 前言 Web Workers 是浏览器提供的 JavaScript 多线程解…...

JVM 与容器化部署调优实践(Docker + K8s)

&#x1f4cc; 文章目录 &#x1f4d8; 前言1️⃣ 容器环境下 JVM 面临的新挑战2️⃣ JVM 的容器资源感知机制详解3️⃣ JVM 内存调优&#xff1a;如何正确使用堆内存4️⃣ JVM CPU 调优&#xff1a;GC 与编译线程控制5️⃣ Kubernetes 典型配置误区与对策6️⃣ 实战案例&#…...

Android OkHttp控制链:深入理解网络请求的流程管理

OkHttp作为Android和Java平台上广泛使用的HTTP客户端&#xff0c;其核心设计之一就是"控制链"(Chain)机制。本文将深入探讨OkHttp控制链的工作原理、实现细节以及如何利用这一机制进行高级定制。 一、什么是OkHttp控制链 OkHttp控制链是一种责任链模式的实现&#…...

《易经》的数学表达:初级版和高级版

《易经》的数学表达&#xff0c; 一、初级版&#xff0c;可基于以下框架构建&#xff0c; 涵盖符号系统、结构代数及变换规则&#xff1a; 此框架将《易经》抽象为离散数学结构&#xff0c;兼容符号逻辑、概率论与群论&#xff0c;为算法化占断、卦象拓扑分析及跨文化比较提供…...

卷积神经网络基础(十)

之前我们学习了SGD、Momentum和AdaGrad三种优化方法&#xff0c;今天我们将继续学习Adam方法。 6.1.6 Adam 我们知道Momentum参照的是小球在碗中滚动的物理规则进行移动而实现的&#xff0c;AdaGrad为参数的每个元素适当地调整更新步伐。那如果我们将这两种方法融合在一起会不…...

怎么把cursor(Cursor/ollama)安装到指定路径

使用PowerShell命令 打开电脑开始菜单&#xff0c;输入powerShell&#xff0c;使用管理员权限打开powerShell窗口&#xff0c;使用cd命令到cursor或ollama安装包的下载目录&#xff0c;如我的Cursor所在的目录为D:\environment\cursor\soft&#xff0c;输入以下 cd E:\downloa…...

第21天-pyttsx3语音播放功能

示例1:语音参数控制(语速/音量/音调) import pyttsx3def speech_demo():engine = pyttsx3.init()# 获取当前语音参数print("默认语速:", engine.getProperty(rate))print("默认音量:", engine.getProperty(volume))print("可用语音:", engin…...

Multi-Query Attention:传统自注意力( Self-Attention)优化显存和加速方案

本文导读&#xff1a;Multi-Query Attention&#xff08;MQA&#xff09;是 Google Research 2022 年提出的一项轻量化注意力技术&#xff0c;通过“多查询、单键值”的设计&#xff0c;把自注意力层的 KV 缓存从 O(hnd) 降到 O(nd)&#xff0c;在不牺牲模型精度的前提下大幅节…...

学习路之uniapp--unipush2.0推送功能--服务端推送消息

学习路之uniapp--unipush2.0推送功能--服务端推送消息 一、二、三、 一、 二、 三、...

如何使用AI搭建WordPress网站

人工智能正迅速成为包括网页设计在内的许多行业在其功能设置中添加的一种工具。在数字设计和营销领域&#xff0c;许多成熟的工具都在其产品中添加了人工智能功能。WordPress 也是如此。作为目前最流行的网站建设工具之一&#xff0c;WordPress 的人工智能插件越来越多也就不足…...

Java 项目管理工具:Maven 与 Gradle 的深度对比与选择

Java 项目管理工具&#xff1a;Maven 与 Gradle 的深度对比与选择 在 Java 开发领域&#xff0c;项目管理工具对于项目的构建、依赖管理等起着至关重要的作用。Maven 和 Gradle 是目前最主流的两款工具&#xff0c;它们各自有着独特的优势和适用场景。本文将对 Maven 与 Gradl…...

Elasticsearch简单集成java框架方式。

Elasticsearch 在 Java 中最常用的客户端是什么&#xff1f;如何初始化一个 RestHighLevelClient&#xff1f;如何用 Spring Boot 快速集成 Elasticsearch&#xff1f;Spring Data Elasticsearch 如何定义实体类与索引的映射&#xff1f; 最常用的 Java 客户端 目前官方推荐使用…...

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Hidden Search Widget (交互式搜索框)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— Hidden Search Widget 组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ ✨ 组件目标 点击按钮展开隐藏的搜索框 再次点击按钮…...

python爬虫和逆向:百度翻译数据采集的几种方式

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、官方API方式(推荐)1.1 百度翻译开放平台API二、网页版逆向方式(代码可直接运行)2.1 拿到js加密方法2.2 python解密代码三、浏览器自动化方式3.1 Selenium自动化操作3.2 Playwright自动化四、移动端API逆向4.1 分…...

spring5-配外部文件-spEL-工厂bean-FactoryBean

spring配外部文件 我们先在Spring里配置一个数据源 1.导c3p0包,这里我们先学一下hibernate持久化框架&#xff0c;以后用mybites. <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.…...

Ubuntu部署私有Gitlab

这个东西安装其实挺简单的&#xff0c;但是因为我这边迁移了数据目录和使用自己安装的 nginx 代理还是踩了几个坑&#xff0c;所以大家可以注意下 先看下安装 # 先安装必要组件 sudo apt update sudo apt install -y curl openssh-server ca-certificates tzdata perl# 添加gi…...

Activiti 7建表语句及注释

Activiti数据库表Oracle兼容DM建表语句及字段注释。 附件下载版地址点这里 --通用属性表 create table ACT_GE_PROPERTY (NAME_ NVARCHAR2(64),VALUE_ NVARCHAR2(300),REV_ INTEGER,primary key (NAME_) );COMMENT ON TABLE ACT_GE_PROPERTY IS 通用属性表;COMMENT ON COLUMN …...

React中使用 Ant Design Charts 图表

// 引入 Ant Design Charts 的柱状图组件 Column import { Column } from ant-design/charts;// 定义函数组件 App&#xff0c;用于展示柱状图 function App() {// 数据源&#xff1a;每个对象代表一个柱子&#xff0c;包含类型&#xff08;type&#xff09;和销售额&#xff0…...

佰力博科技与您探讨压电材料的原理与压电效应的应用

压电材料的原理基于正压电效应和逆压电效应&#xff0c;即机械能与电能之间的双向转换特性。 压电材料的原理源于其独特的晶体结构和电-机械耦合效应&#xff0c;具体可分为以下核心要点&#xff1a; 1. ‌正压电效应与逆压电效应的定义‌ ‌正压电效应‌&#xff1a;当压电…...

vscode打开vue + element项目

好嘞&#xff0c;我帮你详细整理一个用 VS Code 来可视化开发 Vue Element UI 的完整步骤&#xff0c;让你能舒服地写代码、预览界面、调试和管理项目。 用 VS Code 可视化开发 Vue Element UI 全流程指南 一、准备工作 安装 VS Code 官网下载安装&#xff1a;https://code…...

一步步解析 HTTPS

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

使用vue2做一个生成二维码的案例【可当组件使用】

最近有个需求需要用前端来生成一个二维码&#xff0c;就封装了一个简单的组件&#xff0c;这篇文章来分享给大家。 使用的技术&#xff1a; Vue2 Ant Design Vue QRCodeJS2 node版本&#xff1a;16.20 组件样式&#xff1a; 大家可以根据自己的需求来调整代码。 依赖安装&am…...

Hadoop-HA高可用集群启动nameNode莫名挂掉,排错解决

Hadoop-HA高可用集群启动nameNode莫名挂掉&#xff0c;排错解决 nameNode错误日志 2025-05-21 16:14:12,218 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: node01/192.168.191.111:8485. Already tried 5 time(s); retry policy is RetryUpToMaximumCoun…...

从零基础到最佳实践:Vue.js 系列(2/10):《模板语法与数据绑定》

Vue.js 模板语法与数据绑定&#xff1a;从基础到实践 关键点 Vue.js 的模板语法使用 HTML 结合特殊指令&#xff08;如 v-bind、v-on&#xff09;&#xff0c;实现动态界面。插值&#xff08;{{ }}&#xff09;显示数据&#xff0c;指令控制 DOM 行为&#xff0c;双向绑定简化…...

第二章:Android常用UI控件

1、介绍&#xff1a; 控件是界面组成的主要元素&#xff0c;界面中的控件有序排放和完美组合&#xff0c;便可在用户眼前呈现出丰富多彩的页面。 2、常用控件&#xff1a; 一、TextView控件&#xff1a; 在使用手机时&#xff0c;经常会看见一些文本信息&#xff0c;这些文本…...

LeetCode 1004. 最大连续1的个数 III

LeetCode 1004题 “最大连续1的个数 III” 是一道关于数组和滑动窗口的问题。题目描述如下&#xff1a; 题目描述 给定一个由若干 0 和 1 组成的数组 nums&#xff0c;以及一个整数 k。你可以将最多 k 个 0 翻转为 1。返回经过翻转操作后&#xff0c;数组中连续 1 的最大个数…...

Flink CDC 3.4 发布, 优化高频 DDL 处理,支持 Batch 模式,新增 Iceberg 支持

引言 Apache Flink 社区很开心地宣布&#xff0c;在经过4个月的版本开发之后&#xff0c;Flink CDC 3.4.0 版本已经正式发布。Flink CDC 是流行的流式数据集成框架&#xff0c;CDC 3.4.0 版本强化了框架对于高频表结构变更的支持&#xff0c;框架支持了 batch 执行模式&#x…...

NIFI的处理器:JSLTTransformJSON 2.4.0

该处理器使用JSLT转换FlowFile JSON有效负载的格式。使用转换后的内容创建新的FlowFile&#xff0c;并将其路由到“成功”关系。如果JSLT转换失败&#xff0c;则将原始FlowFile路由到“失败”关系。 需要注意的是&#xff0c;编译JSLT转换可能相当昂贵。理想情况下&#xff0c…...

k8s-ServiceAccount 配置

在 Kubernetes 中 ServiceAccount 是一种为 Pod 提供身份认证的机制&#xff0c;允许 Pod 以特定的身份访问 Kubernetes API 服务器。 **Role&#xff08;角色&#xff09;**是 Kubernetes 中定义权限的资源对象&#xff0c;它只能在特定的命名空间内生效。Role 用于定义一组权…...

Python Lambda 表达式

​在 Python 编程中&#xff0c;Lambda 表达式是一个非常强大且实用的工具&#xff0c;它就像一把瑞士军刀&#xff0c;能在各种场景下帮助我们写出简洁、优雅的代码。接下来&#xff0c;就让我们一起深入探索 Python Lambda 表达式的奥秘。 一、Lambda 表达式的基础认知​ 1…...

【ffmpeg】ffprobe基本用法

ffprobe 是 FFmpeg 工具集中的一个强大命令行工具&#xff0c;主要用于分析多媒体文件&#xff08;如视频、音频等&#xff09;的格式和内容信息。它可以提取文件的元数据、编解码器信息、流详情、帧信息等&#xff0c;而无需对文件进行转码或修改。 基本用法 ffprobe [选项] …...

Java 代码生成工具:如何快速构建项目骨架?

Java 代码生成工具&#xff1a;如何快速构建项目骨架&#xff1f; 在 Java 项目开发过程中&#xff0c;构建项目骨架是一项繁琐但又基础重要的工作。幸运的是&#xff0c;Java 领域有许多代码生成工具可以帮助我们快速完成这一任务&#xff0c;大大提高开发效率。 一、代码生…...

模板初阶【C++】

一、 泛型编程 前言&#xff1a; 我们经常会用到数据的交换&#xff0c;C中的函数重载可以完成 //函数重载 void swap(int& x,int& y) {int tmp x;x y;y tmp; }void swap(double& x, double& y) {double tmp x;x y;y tmp; }void swap(char& x, ch…...

URL 类知识点详解

URL 类知识点详解 1. 基本概念与位置 所属包: java.net.URL核心功能: 表示统一资源定位符(Uniform Resource Locator),用于标识和定位网络资源(如网页、文件、API接口)。支持多种协议:HTTP、HTTPS、FTP、file(本地文件)等。不可变类:一旦创建,内容不可修改(线程安全…...

如何使用redis做限流(golang实现小样)

在实际开发中,限流(Rate Limiting)是一种保护服务、避免接口被恶意刷流的常见技术。常用的限流算法有令牌桶、漏桶、固定窗口、滑动窗口等。由于Redis具备高性能和原子性操作,常常被用来实现分布式限流。 下面给出使用Golang结合Redis实现简单限流的几种常见方式(以“固定…...

OpenHarmony外设驱动使用 (九),Pin_auth

OpenHarmony外设驱动使用 &#xff08;九&#xff09; Pin_auth 概述 功能简介 口令认证是端侧设备不可或缺的一部分&#xff0c;为设备提供一种用户认证能力&#xff0c;可应用于设备解锁、支付、应用登录等身份认证场景。用户注册口令后&#xff0c;口令认证模块就可为设备…...

MySQL基础(​​InnoDB)

✅ ​​InnoDB​​&#xff1a;支持事务、行级锁、外键。 ​​为什么要用事务&#xff1f;​​ ​​安全​​&#xff1a;如果中途发现错误&#xff08;比如改错分数&#xff09;&#xff0c;可以一键撤销所有操作&#xff0c;就像游戏里的“回档”功能&#xff01; ​​原子…...

自建srs实时视频服务器支持RTMP推流和拉流

文章目录 一、整体示意图二、服务器端1.srs简介及架构2.docker方式安装3.k8s方式安装4.端口 三、推流端1.OBS Studio2.ffmpeg推流3.streamlabs苹果手机4.twire安卓手机5.网络推流摄像头 四、拉流端1.vlc2.srs 参考awesome系列&#xff1a;https://github.com/juancarlospaco/aw…...

​C++性能优化的7大核心策略与实战案例

在大型C项目中&#xff0c;性能优化需从语言特性、系统架构、硬件特性等多维度切入。以下是经过验证的关键技术路径&#x1f447; &#x1f527; ​一、内存管理的极致控制​ ​问题​&#xff1a;频繁的动态内存分配会导致性能抖动和内存碎片&#xff0c;尤其在实时系统中可能…...

《国家高等教育智慧平台:重塑学习新时代》

时代之需&#xff1a;平台应运而生 在数字化浪潮席卷全球的当下&#xff0c;高等教育领域也在经历着深刻的变革。数字化技术的迅猛发展&#xff0c;正以前所未有的力量重塑着高等教育的形态。从在线课程的兴起&#xff0c;到虚拟实验室的应用&#xff0c;再到智能化教学工具的普…...