03-JAVA设计模式-组合模式
组合模式
什么是组合模式
组合模式(Composite Pattern)允许你将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端以统一的方式处理单个对象和对象的组合。组合模式让你可以将对象组合成树形结构,并且能像单独对象一样使用它们。
组合模式使用场景
把部分和整体的关系用树形结构来表示,从而是客户端可以使用统一的方式处理部分对象和整体对象。
组合模式核心
抽象构件(Component)角色:定义了叶子和容器构件的共同特点
叶子(Leaf)构件角色:无子节点
容器(Composite)构件角色:有容器特征,可以包含子节点

组合模式工作流程分析
- 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,是的用户在使用是可以一致性的对待容器和叶子
- 当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也抱恨这个方法的成员,并调用执行,其中使用了递归调用的机制对整个结构进行处理。
代码实现结构
Component.java
// 抽象构件
public interface Component {// 相同行为操作void operation();
}
Leaf.java
// 叶子
public class Leaf implements Component {@Overridepublic void operation() {System.out.println("叶子单独操作");}
}
Composite.java
import java.util.ArrayList;
import java.util.List;// 容器节点
public class Composite implements Component{// 作为容器存储子节点信息private List<Component> components = new ArrayList<>();public Composite(List<Component> components) {this.components = components;}public List<Component> getComponents() {return components;}public void setComponents(List<Component> components) {this.components = components;}@Overridepublic void operation() {System.out.println("容器构件操作");for (Component component : components) {// 递归执行叶子节点操作component.operation();}}
}
案例
模拟杀毒软件的架构设计
UML

实现代码
AbstractFile.java
// 抽象组件
public interface AbstractFile {// 杀毒功能void killVirus();
}
ImagesFile.java
// 图片类型文件
public class ImagesFile implements AbstractFile{private String name;public ImagesFile(String name) {this.name = name;}@Overridepublic void killVirus() {System.out.printf("图片类型文件-%s-进行扫毒%n",this.name);}
}
TxtFile.java
// 文本类型文件
public class TxtFile implements AbstractFile{private String name;public TxtFile(String name) {this.name = name;}@Overridepublic void killVirus() {System.out.printf("文本类型文件-%s-进行扫毒%n",this.name);}
}
VideoFile.java
// 视频类型文件
public class VideoFile implements AbstractFile{private String name;public VideoFile(String name) {this.name = name;}@Overridepublic void killVirus() {System.out.printf("视频类型文件-%s-进行扫毒%n",this.name);}
}
Floder.java
import java.util.ArrayList;
import java.util.List;// 容器构件:目录
public class Floder implements AbstractFile{private String name;// 子节点private List<AbstractFile> lists = new ArrayList<AbstractFile>();public Floder(String name, List<AbstractFile> lists) {this.name = name;this.lists = lists;}@Overridepublic void killVirus() {System.out.printf("扫描当前目录-%s%n",this.name);for(AbstractFile abstractFile : lists){abstractFile.killVirus();}}
}
TestClient.java
import java.util.ArrayList;
import java.util.List;public class TestClient {public static void main(String[] args) {AbstractFile file1 = new TxtFile("花无缺.TXT");AbstractFile file2 = new ImagesFile("花无缺.png");AbstractFile file3 = new ImagesFile("花无缺.avi");List<AbstractFile> list = new ArrayList<AbstractFile>();list.add(file1);list.add(file2);list.add(file3);Floder floder = new Floder("huawuque",list);AbstractFile file4 = new TxtFile("小鱼儿.TXT");AbstractFile file5 = new ImagesFile("小鱼儿.png");AbstractFile file6 = new ImagesFile("小鱼儿.avi");List<AbstractFile> list1 = new ArrayList<AbstractFile>();list1.add(file4);list1.add(file5);list1.add(file6);Floder floder2 = new Floder("xuaiyuer",list1);List<AbstractFile> list3 = new ArrayList<AbstractFile>();list3.add(floder);list3.add(floder2);Floder floder3 = new Floder("绝代双骄",list3);floder3.killVirus();}
}
执行结果

gitee源码
git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git
相关文章:
03-JAVA设计模式-组合模式
组合模式 什么是组合模式 组合模式(Composite Pattern)允许你将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端以统一的方式处理单个对象和对象的组合。组合模式让你可以将对象组合成树形结构,并且能像单独对象一…...
C++发票识别、发票查验接口示例,您的“发票管理专家”
发票识别发票查验接口。当财务人员在进行发票的数字化管理时,仅需一键上传发票图片,翔云发票识别接口即可快速、精准对发票的全票面信息进行提取,翔云发票查验接口可根据识别接口提取的发票信息实时联网进行真伪查验。助财务工作者从发票海洋…...
【电控笔记6.2】拉式转换与转移函数
概要 laplace:单输入单输出,线性系统 laplace 传递函数 总结...
第十五届蓝桥杯题解-数字接龙
题意:经过所有格子,并且不能进行交叉,走的下一个格子必须是当前格子值1%k,输出路径最小的那一条(有8个方向,一会粘图) 思路:按照8个方向设置偏移量进行dfs,第一个到达终…...
【vue】绑定事件 v-on
v-on 简写: clickkeyupkeydownkeyup.wkeyup.ctrl.a <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...
【应用】SpringBoot-自动配置原理
前言 本文简要介绍SpringBoot的自动配置原理。 本文讲述的SpringBoot版本为:3.1.2。 前置知识 在看原理介绍之前,需要知道Import注解的作用: 可以导入Configuration注解的配置类、声明Bean注解的bean方法;可以导入ImportSele…...
中文编程入门(Lua5.4.6中文版)第十二章 Lua 协程 参考《愿神》游戏
在《愿神》的提瓦特大陆上,每一位冒险者都拥有自己的独特力量——“神之眼”,他们借助元素之力探索广袤的世界,解决谜题,战胜敌人。而在提瓦特的科技树中,存在着一项名为“协同程序”的高级秘术,它使冒险者…...
C++笔记之注册回调函数常见的5种情况对比
C++笔记之注册回调函数常见的5种情况对比 —— 2024-04-10 code review! 文章目录 C++笔记之注册回调函数常见的5种情况对比1.五种情况2.示例2.1. `RegisterCallback` 和 `Callback` 都是普通函数2.2. `RegisterCallback` 是成员函数,`Callback` 是普通函数2.3. `RegisterC…...
人工智能揭示矩阵乘法的新可能性
人工智能揭示矩阵乘法的新可能性 数学家酷爱漂亮的谜题。当你尝试找到最有效的方法时,即使像乘法矩阵(二维数字表)这样抽象的东西也会感觉像玩一场游戏。这有点像尝试用尽可能少的步骤解开魔方——具有挑战性,但也很诱人。除了魔方…...
实在智能携手长江新零售俱乐部:探秘实在Agent数字员工,开启零售品牌增长新篇章
近日,实在智能携手长江新零售俱乐部成功举办了“AIGC:数字员工助力零售品牌新增长”主题活动,成功吸引了二十余家企业中高层管理精英的踊跃参与。在此次活动中,与会者围绕零售业数字化转型的当前态势、面临的挑战及其重要性进行了…...
计算机科学与导论 第十七 十八章 计算理论,人工智能
文章预览: 计算理论17.1 引言17.2 简单语言17.3 图灵机邱奇 -图灵 论题 人工智能引言18.1.1 什么是人工智能18.1.2 智能体18.1.3 编程语言 18.2 知识的表示18.2.1 语义网18.2.2 框架18.2.3 谓词逻辑18.2.4 基于规则的系统 18.2 专家系统18.3 语言理解18.4 搜索18.5 …...
linux 设置定时任务---学习
1、设置定时任务 crontab -e 设置格式参考:【Linux】Linux crontab 命令定时任务设置_crontab 设置每天10:30执行-CSDN博客 测试过程: */1 * * * * /root/cronjob.sh 脚本内容: echo "hell0 cronjob" >> /root/test/hello.txt 实现…...
钡铼IOy系列模块深挖工业场景需求提供丰富多样的I/O解决方案
钡铼IOy系列模块以其灵活性和多样性,在工业场景中提供了丰富多样的I/O解决方案,满足了不同行业、不同应用场景的需求。以下是一些常见的工业场景需求及钡铼IOy系列模块提供的解决方案: 1. 工厂自动化 需求:工厂自动化需要对生产线…...
【刷题笔记】第三天
两道简单题 文章目录 [2923. 找到冠军 I](https://leetcode.cn/problems/find-champion-i/description/)[3095. 或值至少 K 的最短子数组 I](https://leetcode.cn/problems/shortest-subarray-with-or-at-least-k-i/description/) 2923. 找到冠军 I 方法1: 如果 i …...
开源模型应用落地-LangChain试炼-CPU调用QWen1.5(一)
一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 通过langchain框…...
STM32-模数转化器
ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换 为离散的数字信号的器件。 ADC相关参数说明: 分辨率: 分辨率以二进制(或十进制)数的位数来表示,一般有 8 位、10 位、12 位、16 位…...
算法刷题记录2
4.图 4.1.被围绕的区域 思路:图中只有与边界上联通的O才不算是被X包围。因此本题就是从边界上的O开始递归,找与边界O联通的O,并标记为#(代表已遍历),最后图中剩下的O就是:被X包围的O。图中所有…...
中国代工巨头旗下芯片公司遭网络攻击,千兆字节数据被泄露
近日,中国智能手机代工巨头闻泰科技旗下荷兰芯片制造商Nexperia发布声明,称其遭遇网络攻击,有未经授权的第三方访问了公司的 IT 服务器,目前已向相关部门报告了此次事件,并与网络安全专家合作开启调查。而据相关消息&a…...
【ARM 裸机】汇编 led 驱动之基本语法
我们要编写的是 ARM 汇编,编译使用的是 gcc 交叉编译器,所以要符合 GNU 语法。 1、汇编指令 汇编由一条条指令构成,ARM 不能直接访问存储器,比如 RAM 中的数据,I.MX6UL 中的寄存器就是 RAM 类型的,我们用…...
scala---基础核心知识(变量定义,数据类型,流程控制,方法定义,函数定义)
一、什么是scala Scala 是一种多范式的编程语言,其设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。 二、为什么要学习scala 1、优雅 2、速度快 3、能融合到hado…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
