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

二十三、设计模式之组合模式![

目录

  • 二十三、设计模式之组合模式
    • 能帮我们干什么?
      • 主要解决什么问题?
      • 优缺点
        • 优点
        • 缺点:
    • 使用的场景
    • 理解
    • 实现
      • 角色
      • 组合模式
    • 总结

在这里插入图片描述

魔战已经完结。成功登顶。占领敌军最高峰。

二十三、设计模式之组合模式

“组合模式”也被称为“部分整体模式”该模式属于结构型模式的一种。
将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

所属类型定义
结构型将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

能帮我们干什么?

主要解决什么问题?

主要解决的是 它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

优缺点

优点

1、高层模块调用简单。
2、节点自由增加。

缺点:

在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。


使用的场景

以下情况下适用Composite模式:
1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
部分、整体场景,如树形菜单,文件、文件夹的管理。

理解

讲解该模式之前先带大家熟悉一下“树形结构”。相信大家对“树形结构”不会太陌生,如果你刚好不太了解的话可以想一下大树,一颗树它分别有树根、树枝、树叶,正好树形结构中也有根节点、子节点(非叶子节点)、叶子节点。
在这里插入图片描述

组合模式就运用了树形结构,该模式的核心思想是:将多个对象组合成树形结构,以此结构来表示“整体-部分”之间的层次关系。

实现

在这里插入图片描述

角色

  1. Component:组合模式中的“根节点”,可以是接口、抽象类、普通类,该类中定义了其子类的所有共性内容,并且该类中还存在着用于访问和管理它子部件的方法。
  2. Leaf:组合中的叶子节点,也就是最末端的节点,该节点下不会再有子节点。
  3. Composite:非叶子节点,它的作用是存储子部件,并且在Composite中实现了对子部件的相关操作。

组合模式

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

实现难度: ⭐️ ⭐️ ⭐️ ⭐️

举例:
java/com/kongxiang/raindrop/dp/type/structure/composite · master · 无难事者若执 / 23种设计模式 · GitCode
叶节点和组合节点。

component

public abstract class Component {protected  String name;public Component(String name){this.name = name;}public abstract void draw();public abstract void add(Component component);public abstract void remove(Component component);}

leaf

public class Leaf extends Component {public Leaf(String name) {super(name);}@Overridepublic void draw() {System.out.println(this.name);}@Overridepublic void add(Component component) {throw new IllegalArgumentException("叶节点不能添加组件");}@Overridepublic void remove(Component component) {throw new IllegalArgumentException("叶节点不能移除组件");}
}

composite

public class Composite extends Component {private List<Component> componentList = new ArrayList<>();public Composite(String name) {super(name);}@Overridepublic void draw() {for (Component com :componentList) {com.draw();}}@Overridepublic void add(Component component) {this.componentList.add(component);}@Overridepublic void remove(Component component) {this.componentList.remove(component);}
}

client

     public static void main(String[] args) {Leaf leaf = new Leaf("张三”");Leaf leaf1 = new Leaf("张4”");Leaf leaf2 = new Leaf("张5”");Leaf leaf3 = new Leaf("张6”");Leaf leaf4 = new Leaf("张7”");Composite composite = new Composite("组1");composite.add(leaf);composite.add(leaf1);Composite composite2 = new Composite("组2");composite2.add(leaf2);composite2.add(leaf3);Composite composite3 = new Composite("组3");composite3.add(leaf4);composite.add(composite2);composite2.add(composite3);composite.draw();}

总结

组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以像处理简单元素一样来处理复杂元素。
如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择。本章使用了一个文件系统的例子来举例说明了组合模式的用途。在这个例子中,文件和目录都执行相同的接口,这是组合模式的关键。通过执行相同的接口,你就可以用相同的方式对待文件和目录,从而实现将文件或者目录储存为目录的子级元素。

相关文章:

二十三、设计模式之组合模式![

目录 二十三、设计模式之组合模式能帮我们干什么&#xff1f;主要解决什么问题&#xff1f;优缺点优点缺点&#xff1a; 使用的场景理解实现角色组合模式 总结 魔战已经完结。成功登顶。占领敌军最高峰。 二十三、设计模式之组合模式 “组合模式”也被称为“部分整体模式”该…...

hbase和aerospike基础概念及所对应的python包API使用

Hbase Hbase shell常用操作 1.创建表 create table name,column familytable name&#xff1a;表名 column family:列族名 2.查看所有表名称 list3.插入操作 put table name,row1,column family:column name,valuerow1:行键(即Row Key) column family:column name&#xf…...

监测难?误差大?北斗突破铁路监测预警难题,24小时全方位守护

受极端气象和复杂地形地质条件的影响&#xff0c;近年来铁路沿线地质灾害易发频发。为防范化解重大安全风险&#xff0c;提高自然灾害防治能力&#xff0c;国务院决策部署制定了《关于加强铁路自然灾害监测预警工作的指导意见》&#xff0c;强调了利用先进技术和手段开展各类自…...

kafka入门03——简单实战

目录 安装Java 安装Zookeeper 安装Kafka 生产与消费 主要是记录下Kafka的安装配置过程&#xff0c;前置条件需要安装jdk和zookeeper。 安装Java 1.Oracle官网下载对应jdk安装包 官网地址&#xff1a;Java Downloads | Oracle 好人分享了下载需要的oracle账号&#xff0c…...

工作两年,本地git分支达到了惊人的361个,该怎么快速清理呢?

说在前面 不知道大家平时工作的时候会不会需要经常新建git分支来开发新需求呢&#xff1f;在我这边工作的时候&#xff0c;需求都是以issue的形式来进行开发&#xff0c;每个issue新建一个关联的分支来进行开发&#xff0c;这样可以通过issue看到一个需求完整的开发记录&#x…...

行业追踪,2023-10-24

自动复盘 2023-10-24 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…...

【成功实现】CentOS磁盘扩容

对服务器磁盘扩容操作步骤 查看磁盘信息 fdisk -l 创建新分区 fdisk /dev/sda P n p … t 回车 8e w 重启虚拟机 reboot mkfs.ext4 /dev/sda4 查看磁盘信息 fdisk -l 创建物理卷 pvcreate /dev/sda4 y 创建卷组 并绑定物理卷 vgcreate centos /dev/sda4 创建逻辑…...

为什么亚马逊卖家一定要有独立站?新手低成本快速搭建跨境电商独立站完整图文教程

效果展示 翻译助手 一、购买域名 二、购买主机托管 三、搭建独立网站 四、网站装修设计 五、网站迁移 六、补充 前言&#xff1a;为什么亚马逊卖家一定要有独立站&#xff1f; 先来谈谈为什么亚马逊卖家一定得有独立站&#xff0c;从我一些个人经历来看&#xff0c;有独…...

spring Environment上下文环境参数变量

spring通过Environment对象来存储上下文环境变量信息&#xff0c;即包含当前系统环境变量也包含配置文件配置变量。Environment作为一个bean被存放在容器中&#xff0c;可以在需要的地方进行依赖注入直接使用。 Environment的创建 以AnnotationConfigApplicationContext容器类…...

【数据库】组合查询 UNION

组合查询 概述组合查询UNIONUNION ALLINTERSECTEXCEPT 概述 组合查询允许将两个或多个查询的结果合并成一个单一的结果集。组合查询分类包括 UNION、UNION ALL、INTERSECT 和 EXCEPT 来合并查询结果。下述不同的组合查询&#xff1b; 下述示例中将使用的表&#xff1a;Illino…...

Spring Boot配置 application.yml,根据application.yml选择启动配置

在Spring Boot 中可以选择applicant.properties 作为配置文件&#xff0c;也可以通过在application.yml中进行配置&#xff0c;让Spring Boot根据你的选择进行加载启动配置文件。 这种配置方式&#xff0c;我们通常在实际开发中经常使用&#xff0c;主要为了发布版本和以及开发…...

一文了解GC垃圾回收

一文了解GC垃圾回收 1 判断一个对象为垃圾对象的方法 引用计数法(弃用) 可达性分析算法 是否有指向GC root 的引用链&#xff0c;如果有&#xff0c;不是垃圾对象 ---->GC roo:即rt.jar包中内容 2 内存泄漏与内存溢出区别 泄漏&#xff1a;原本需要被回收的对象&#…...

触摸屏与施耐德PLC之间MODBUS无线通讯

一、 硬件连接 1、PLC通讯接口说明&#xff1a; 2、通讯电缆图&#xff1a; 二、PLC设置 1. 配置端口&#xff1a; 双击串行线路—弹出右侧设置窗口---设置串口通讯参数 2. 添加MODBUS协议。 ① 右击串口线路&#xff0c;选择添加设备&#xff1a; ② 选择现场总线&#xf…...

BOA服务器(一):简介

在嵌入式设备的管理与交互中&#xff0c;基于Web方式的应用成为目前的主流&#xff0c;这种程序结构也就是大家非常熟悉的B/S结构&#xff0c;即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器&#xff0c;能够生成动态页面&#xff0c;在用户端只需要通过Web浏览器就可以…...

最详细STM32,cubeMX 超声波测距

这篇文章将详细介绍 STM32使用 cubeMX驱动超声波测距 。 文章目录 前言一、超声波模块测距原理 &#xff1a; 二、cubeMX 配置三、实验程序总结 前言 实验材料&#xff1a;STM32F103C8T6开发板&#xff0c; HC-SR04 超声波模块。所需软件&#xff1a;keil5 &#xff0c; cubeM…...

Java实现连接SQL Server解决方案及代码

下面展示了连接SQL Server数据库的整个流程&#xff1a; 加载数据库驱动建立数据库连接执行SQL语句处理结果关闭连接 在连接之前&#xff0c;前提是确保数据库成功的下载&#xff0c;创建&#xff0c;配置好账号密码。 运行成功的代码&#xff1a; import java.sql.*;publi…...

如何用 JMeter 编写性能测试脚本?

Apache JMeter 应该是应用最广泛的性能测试工具。怎么用 JMeter 编写性能测试脚本&#xff1f; 1. 编写 HTTP 性能测试脚本 STEP 1. 添加 HTTP 请求 img STEP 2. 了解配置信息 HTTP 请求各项信息说明&#xff08;以 JMeter 5.1 为例&#xff09;。 如下图所示&#xff1a;…...

vue3+vite在线预览pdf

效果图 代码 <template><div class"pdf-preview"><div class"pdf-wrap"><vue-pdf-embed :source"state.source" :style"scale" class"vue-pdf-embed" :page"state.pageNum" /></div…...

Python深度学习实战-基于Sequential方法搭建BP神经网络实现分类任务(附源码和实现效果)

实现功能 第一步&#xff1a;导入模块&#xff1a;import tensorflow as tf 第二步&#xff1a;制定输入网络的训练集和测试集 第三步&#xff1a;搭建网络结构&#xff1a;tf.keras.models.Sequential() 第四步&#xff1a;配置训练方法&#xff1a;model.compile()&#x…...

【前端】Webpack5中Html和CSS的压缩打包

1.Webpack5简介 1.1.Webpack简介 &#xff08;1&#xff09;webpack的发展历程 2012.3—webpack&#xff08;问世&#xff09; 2014.2—webpack1 2016.12—webpack2 2017.6—webpack3 2018.2—webpack4 2020.10—webpack5&#xff08;要求node版本10.13&#xff09; &a…...

别再浪费主板上的PCIE插槽了!手把手教你用VL805芯片打造高速USB3.0扩展坞

释放主板潜能&#xff1a;基于VL805芯片的USB3.0扩展方案实战指南 当你的工作台摆满外设却苦于主板接口不足时&#xff0c;那些闲置的PCIE插槽正等待被唤醒。本文将从芯片选型到性能调优&#xff0c;完整呈现如何将一块VL805-QFN68芯片转化为高性能USB3.0扩展方案。 1. 硬件选型…...

告别SAP GUI!Notepad++配置ABAP语法高亮,离线查看代码更高效

告别SAP GUI&#xff01;Notepad配置ABAP语法高亮&#xff0c;离线查看代码更高效 对于ABAP开发者而言&#xff0c;代码阅读和分析是日常工作中不可或缺的部分。然而&#xff0c;传统的SAP GUI环境并非总是最便捷的选择——无论是通勤途中、客户现场无系统访问权限&#xff0c;…...

Pterodactyl-installer数据库配置:MySQL用户权限管理与安全最佳实践

Pterodactyl-installer数据库配置&#xff1a;MySQL用户权限管理与安全最佳实践 【免费下载链接】pterodactyl-installer :bird: Unofficial installation scripts for Pterodactyl Panel 项目地址: https://gitcode.com/gh_mirrors/pt/pterodactyl-installer Pterodact…...

VS Code 迎来史诗级更新:全新 Agents 窗口发布

VS Code 在前几年古法编程时代&#xff0c;那就是 IDE 的王者。随着 AI Coding 的不断进步。虽然 VS Code 依托 github copilot 早早的就集成了 AI Coding 的能力。但是由于 VSCode 本身是一个 IDE &#xff0c;它的核心能力还是文本编辑器。但是在 Claude&#xff0c; xcode 等…...

高性能Go Web框架Volo:设计原理、核心功能与生产实践

1. 项目概述&#xff1a;一个高性能的Go语言Web框架最近在折腾一个需要处理高并发请求的API服务&#xff0c;选型时又一次把目光投向了Go生态。说实话&#xff0c;Go的Web框架选择不少&#xff0c;从轻量级的Gin、Echo&#xff0c;到功能更全的Beego、Iris&#xff0c;各有各的…...

OpenAI智能体框架实战:从单智能体到多智能体协作系统构建

1. 项目概述&#xff1a;当AI学会“分工协作”最近在折腾AI应用开发的朋友&#xff0c;估计没少为“智能体”&#xff08;Agent&#xff09;这个概念挠头。一个能理解指令、调用工具、并自主完成复杂任务的AI程序&#xff0c;听起来很酷&#xff0c;但真要从零开始搭建一套稳定…...

从总线到片上网络:高性能SoC互连架构演进与实战解析

1. 从“堵车”的总线到“高速公路网”&#xff1a;为什么我们需要NoC&#xff1f;记得我刚入行做芯片设计那会儿&#xff0c;一个SoC里塞进去几十个IP模块&#xff0c;大家共用一条总线&#xff0c;感觉已经挺“先进”了。那时候的芯片&#xff0c;就像一个小镇&#xff0c;只有…...

1951-2025年中国1km月平均气温逐年年内季节波动幅度数据集

中国1000米分辨率月平均气温数据集&#xff08;1951-2025&#xff09;提供了长时间序列、规则网格的气象背景信息&#xff0c;为开展气候变化分析和区域比较研究提供了基础数据支撑。针对原始月尺度序列直接使用不够便捷的问题&#xff0c;需要进一步形成具有明确主题和统一格式…...

无王无帝定乾坤,来自田间第一人 大道济世安苍生

无王无帝定乾坤来自田间第一人 一、执念 千秋岁月轮转&#xff0c;历朝治乱兴衰&#xff0c;世人始终困于一个执念&#xff1a;天下安定&#xff0c;必靠帝王君临、强权统御。可纵观古今世道&#xff0c;王权更迭往复&#xff0c;霸业起落无常&#xff0c;真正能长久安社稷、润…...

用LoRA微调LLaMA2时,你的显存和参数到底省在哪了?一个公式讲明白

LoRA微调LLaMA2的显存优化原理与工程实践指南 当开发者尝试在消费级显卡上微调大语言模型时&#xff0c;显存限制往往成为首要障碍。以LLaMA2-7B为例&#xff0c;全量微调需要约120GB显存&#xff0c;远超RTX 3090等主流显卡的24GB容量。低秩适配&#xff08;LoRA&#xff09;技…...