结构性设计模式之Composite(组合)

article/2025/6/7 14:49:40

结构性设计模式之Composite(组合)

摘要:
Composite(组合)模式通过树形结构表示"部分-整体"层次关系,使得用户能够统一处理单个对象和组合对象。该模式包含Component(组件接口)、Leaf(叶子节点)和Composite(组合节点)三个核心角色,适用于需要表示对象层次结构并统一操作的场景。示例代码展示了文件夹结构的实现,Folder类管理子组件,File类作为叶子节点,通过递归遍历实现统一处理。该模式简化了客户端代码,使系统更易扩展和维护。

1)意图;

将对象组合成树型结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

2)结构

在这里插入图片描述

其中:

  • Componect 为组合中的对象声明接口:在适当情况下实现所有类共有接口的默认行为:

    声明一个接口用户访问和管理 Componect的子组件;(可选)在递归结构中定义一个

    接口,用于访问一个父组件,并在合适的情况下实现它。

  • Leaf 在组合中表示叶节点对象,叶结点没有子节点节点;在组合中定义图元对象的行为。

  • Composite定义有子组件的那些组件的行为;存储子组件;在Component接口中实现与子组件有关的操作。

  • Client 通过 Component 接口操纵组合组件的对象。

3)适用性

Composite 模式下适用于:

  • 想表示对象的部分-整体层次结构。
  • 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

代码

import java.util.ArrayList;
import java.util.List;/*** @author psd 结构性设计模式之组合设计模式*/
public class ComponentDemo {public static void main(String[] args) {AbstractFile root = new Folder("root");AbstractFile folderA = new Folder("folderA");AbstractFile folderB = new Folder("folderB");AbstractFile fileC = new File("fileC");AbstractFile fileD = new File("fileD");AbstractFile fileE = new File("fileE");root.add(folderA);root.add(folderB);root.add(fileC);folderA.add(fileD);folderA.add(fileE);print(root);}private static void print(AbstractFile file) {file.printName();List<AbstractFile> childrenList = file.getChildren();if (childrenList == null) {return;}for (AbstractFile children : childrenList) {print(children);}}
}abstract class AbstractFile {protected String name;public void printName() {System.out.println(name);}public abstract boolean add(AbstractFile file);public abstract boolean remove(AbstractFile file);public abstract List<AbstractFile> getChildren();
}/*** 文件夹*/
class Folder extends AbstractFile {public Folder(String name) {this.name = name;}List<AbstractFile> children = new ArrayList<>();@Overridepublic boolean add(AbstractFile file) {return children.add(file);}@Overridepublic boolean remove(AbstractFile file) {return children.remove(file);}@Overridepublic List<AbstractFile> getChildren() {return children;}
}class File extends AbstractFile {public File(String name) {this.name = name;}@Overridepublic boolean add(AbstractFile file) {return false;}@Overridepublic boolean remove(AbstractFile file) {return false;}@Overridepublic List<AbstractFile> getChildren() {return null;}}

代码目录结构如下:

在这里插入图片描述
欢我的文章记得点个在看,或者点赞,持续更新中ing…


http://www.hkcw.cn/article/EFscvJQsgB.shtml

相关文章

【Typst】4.导入、包含和读取

概述 上节概述了Typst脚本的基础语法&#xff0c;在此基础上&#xff0c;本节介绍Typst文件的导入、包含和读取的内容。你将可以更简单灵活的组织你的文件内容。 系列目录 1.Typst概述2.Typst标记语法和基础样式3.Typst脚本语法4.导入、包含和读取5.文档结构元素与函数6.布局…

深入解析C++引用:从别名机制到函数特性实践

1.C引用 1.1引用的概念和定义 引用不是新定义⼀个变量&#xff0c;而是给已存在变量取了⼀个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同⼀块内存空间。比如四大名著中林冲&#xff0c;他有一个外号叫豹子头&#xff0c;类比到C里就…

【vue+ts】找不到模块“./App.vue”或其相应的类型声明

报错&#xff1a;找不到模块“./App.vue”或其相应的类型声明。 原因&#xff1a;typescript只能理解.ts文件&#xff0c;无法理解.vue文件。 解决&#xff1a;在src/env.d.ts下添加&#xff1a; /// <reference types"vite/client" /> // 三斜线引用告诉编译…

HTTP Error 400 Bad request 问题分析解决

文章目录 1.问题描述&#xff1a;2.异常信息如下&#xff1a;3.分析异常信息&#xff1a;4.总结&#xff1a; 1.问题描述&#xff1a; 前端保存老是报错HTTP ERROR 400 Bad Request。经过异常分析得出是前端传参导致的后端框架的验证拦截&#xff0c;包的错误。 2.异常信息如下…

数据库的操作

1.查看数据库 show databases; 2.库的创建 create database [IF NOT EXITS] db_name [creat_specification];[]内的是可选选项&#xff0c;IF NOT EXIT表示如果数据库名为db_name的数据库存在就创建数据库&#xff0c;否则就不创建&#xff0c;creat_specification是创建的特…

IP话机和APP拨打电话的区别

‌IP话机和IP电话App&#xff08;如Zoom Phone、Microsoft Teams、Skype等&#xff09;均基于互联网协议&#xff08;VoIP&#xff09;技术实现通话&#xff0c;但在硬件形态、使用场景、功能侧重等方面存在显著差异。以下是主要区别&#xff1a; 1. 硬件形态与部署 IP话机 物…

el-select 实现分页加载,切换也数滚回到顶部,自定义高度

el-select 实现分页加载&#xff0c;切换也数滚回到顶部&#xff0c;自定义高度 1.html <el-form-item label"俱乐部&#xff1a;" prop"club_id" label-width"120px"><el-select :disabled"Boolean(match_id)" style"w…

帝可得- 人员管理

一.需求说明 人员管理业务流程如下&#xff1a; 登录系统&#xff1a; 首先&#xff0c;后台管理人员需要登录到帝可得后台管理系统中。 新增工作人员&#xff1a; 登录系统后&#xff0c;管理人员可以新增工作人员&#xff0c;包括姓名、联系方式等信息。 关联角色&#xf…

【Java Web】7.事务管理AOP

&#x1f4d8;博客主页&#xff1a;程序员葵安 &#x1faf6;感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 文章目录 一、事务管理 1.1 事务回顾 1.2 Spring事务管理 1.3 事务进阶 rollbackFor propagation 二、AOP 2.1 AOP概述 2.2 AOP快速入门…

Matlab实现LSTM-SVM回归预测,作者:机器学习之心

Matlab实现LSTM-SVM回归预测&#xff0c;作者&#xff1a;机器学习之心 目录 Matlab实现LSTM-SVM回归预测&#xff0c;作者&#xff1a;机器学习之心效果一览基本介绍程序设计参考资料 效果一览 基本介绍 代码主要功能 该代码实现了一个LSTM-SVM回归预测模型&#xff0c;核心流…

【开源工具】Python+PyQt5打造智能桌面单词记忆工具:悬浮窗+热键切换+自定义词库

&#x1f4da;【深度解析】PythonPyQt5打造智能桌面单词记忆工具&#xff1a;悬浮窗热键切换自定义词库 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#x…

第二十二章 Shell脚本入门

第二十二章 Shell脚本入门 Shell脚本就是包含一系列命令的文件。Shell读取该文件并执行其中的命令&#xff0c;Shell的独特之处在于它即使系统强大的命令接口&#xff0c;又是脚本语言解释器。 创建并执行Shell脚本 创建并执行脚本&#xff0c;要做到3件事: 编写脚本。将脚…

Pandas取代Excel?

有人在知乎上提问&#xff1a;为什么大公司不用pandas取代excel&#xff1f; 而且列出了几个理由&#xff1a;Pandas功能比Excel强大&#xff0c;运行速度更快&#xff0c;Excel除了简单和可视化界面外&#xff0c;没有其他更多的优势。 有个可怕的现实是&#xff0c;对比Exce…

网络安全运维实训室建设方案

一、网络安全运维人才需求与实训困境 在数字化时代&#xff0c;网络安全已成为国家安全、社会稳定和经济发展的重要基石。随着信息技术的飞速发展&#xff0c;网络安全威胁日益复杂多样&#xff0c;从个人隐私泄露到企业商业机密被盗&#xff0c;从关键基础设施遭受攻击到社会…

【C++篇】STL适配器(下篇):优先级队列与反向迭代器的底层奥秘

&#x1f4ac; 欢迎讨论&#xff1a;在阅读过程中有任何疑问&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果你觉得这篇文章对你有帮助&#xff0c;记得点赞、收藏&#xff0c;并分享给更多对C感兴趣的…

在使用十字滑台的过程中,我们需要注意哪些关键事项呢

在使用十字滑台的过程中&#xff0c;需要注意以下关键事项&#xff1a; 安全操作&#xff1a;在使用十字滑台时&#xff0c;务必要注意安全&#xff0c;戴好手套和护目镜&#xff0c;避免发生意外伤害。 稳定支撑&#xff1a;确保十字滑台稳固地放置在平坦稳定的表面上&#x…

【笔记】用命令手动下载并安装 tokenizers 库.whl文件(Python 3.12+)

Python 3.12 虚拟环境中安装 tokenizers 教程笔记 在 Python 3.12 虚拟环境中安装 tokenizers 库时&#xff0c;我们可能会遇到pip install tokenizers安装失败和找不到适配版本的公开 whl 文件&#xff0c;从而导致tokenizers库缺失的问题。 经过探索&#xff0c;我们找到了…

光子器件仿真软件基础与基于优化方法的器件逆向设计---案例片上米散射结构色超构表面单元仿真

以下为针对片上米散射结构色超构表面单元仿真的技术要点和方法整理&#xff1a; 仿真流程框架 import meep as mp import numpy as np # 创建超构表面单元模型 cell_size mp.Vector3(1, 1, 0) geometry [mp.Cylinder(height0.5, radius0.2, materialmp.Medium(index3.5))] …

软件工程的定义与发展历程

文章目录 一、软件工程的定义二、软件工程的发展历程1. 前软件工程时期(1940s-1960s)2. 软件工程诞生(1968)3. 结构化方法时期(1970s)4. 面向对象时期(1980s)5. 现代软件工程(1990s-至今) 三、软件工程的发展趋势 一、软件工程的定义 软件工程是应用系统化、规范化、可量化的方…

基于SDN环境下的DDoS异常攻击的检测与缓解

参考以下两篇博客&#xff0c;最后成功&#xff1a; 基于SDN的DDoS攻击检测和防御方法_基于sdn的ddos攻击检测与防御-CSDN博客 利用mininet模拟SDN架构并进行DDoS攻击与防御模拟&#xff08;Ryumininetsflowpostman&#xff09;_mininet模拟dos攻击-CSDN博客 需求 H2 模拟f…