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

设计模式-组合模式(Composite)

文章目录

  • 前言
  • 一、组合模式的概念
  • 二、组合模式的优缺点
      • 1.优点
      • 2.缺点
    • 三、组合模式的实现
      • 总结

前言

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树状结构以表示“整体-部分”的层次结构。组合模式使得客户端可以统一处理单个对象和对象组合,而不需要区分它们。

在本篇博客中,我们将详细介绍组合模式的概念,并提供一个简单的Java代码示例来演示如何实现它。

一、组合模式的概念

组合模式的核心思想是将对象组合成树状结构,其中包含两种类型的对象:

  1. 叶子对象(Leaf):表示树中的叶子节点,它们没有子节点,通常是最终的操作对象。

  2. 组合对象(Composite):表示树中的分支节点,它们可以包含子节点,既可以是叶子对象,也可以是组合对象,形成递归结构。

组合模式的结构包括以下要素:

  1. 组件接口(Component):定义了叶子对象和组合对象的通用接口,通常包含一些操作方法,如添加子节点、移除子节点、获取子节点等。

  2. 叶子对象(Leaf):实现了组件接口,表示叶子节点,它们没有子节点。

  3. 组合对象(Composite):也实现了组件接口,表示分支节点,可以包含子节点,包括叶子对象和其他组合对象。

二、组合模式的优缺点

组合模式(Composite Pattern)是一种有用的设计模式,但它也有一些明显的优点和缺点。让我们首先讨论一下组合模式的优点:

1.优点

  1. 统一接口:组合模式允许客户端统一地处理单个对象和组合对象,因为它们共享相同的抽象接口。这使得客户端代码更加简单和一致。

  2. 灵活性:组合模式使得你可以很容易地添加新的叶子对象或组合对象,而不需要修改现有代码。这提高了系统的灵活性和可扩展性。

  3. 层次结构:组合模式适用于表示树状结构的层次关系,例如文件系统、组织结构等。它使得处理复杂的层次结构变得更加容易。

  4. 代码重用:由于组合模式鼓励使用相同的抽象接口,这有助于提高代码的重用性。你可以将相同的操作应用于不同的对象组合。

  5. 单一责任原则:组合模式有助于遵循单一责任原则,因为叶子对象和组合对象各自负责自己的任务。这有助于减少代码的耦合度。

2.缺点

  1. 复杂性:在一些情况下,组合模式可能会引入复杂性,特别是在处理大量对象时。递归遍历整个组合结构可能会导致性能问题。

  2. 不适用于所有情况:组合模式并不是在所有情况下都适用的。对于不具备树状结构的对象集合,引入组合模式可能会显得过于繁琐。

  3. 设计抽象度:确定何时使用组合模式以及如何划分组件和容器可以需要一些经验和抽象思维。不当的设计可能导致模式失效或不必要的复杂性。

  4. 限制操作:由于共享相同的接口,组合模式可能会限制某些操作的可用性,因为不同对象具有不同的能力。这需要在设计时谨慎考虑。

综上所述,组合模式是一种有助于构建树状结构的对象组合的强大模式,它具有许多优点,包括统一接口、灵活性和代码重用。然而,需要根据具体的应用场景来权衡其优点和缺点,以确保正确选择和实现该模式。在处理复杂的层次结构和对象组合时,组合模式通常是一个非常有用的设计工具。

三、组合模式的实现

让我们通过一个简单的示例来演示组合模式的实现。我们将创建一个文件系统的树状结构,其中包含文件和文件夹。

首先,我们定义组件接口 Component

// 组件接口
interface Component {void showInfo();
}

然后,我们创建叶子对象 File

// 叶子对象 - 文件
class File implements Component {private String name;public File(String name) {this.name = name;}public void showInfo() {System.out.println("File: " + name);}
}

接下来,我们创建组合对象 Folder

import java.util.ArrayList;
import java.util.List;// 组合对象 - 文件夹
class Folder implements Component {private String name;private List<Component> children = new ArrayList<>();public Folder(String name) {this.name = name;}public void add(Component component) {children.add(component);}public void remove(Component component) {children.remove(component);}public void showInfo() {System.out.println("Folder: " + name);for (Component component : children) {component.showInfo();}}
}

最后,我们编写客户端代码来测试组合模式:

public class CompositePatternDemo {public static void main(String[] args) {File file1 = new File("file1.txt");File file2 = new File("file2.txt");Folder folder1 = new Folder("Folder 1");folder1.add(file1);folder1.add(file2);File file3 = new File("file3.txt");Folder folder2 = new Folder("Folder 2");folder2.add(file3);Folder rootFolder = new Folder("Root");rootFolder.add(folder1);rootFolder.add(folder2);rootFolder.showInfo();}
}

在这个示例中,我们创建了文件和文件夹的树状结构,其中包含了叶子对象和组合对象。客户端可以递归地访问整个文件系统,而不需要关心对象是文件还是文件夹,体现了组合模式的统一处理特性。

总结

组合模式是一种非常有用的设计模式,特别适用于构建树状结构的对象组合。它允许你统一处理单个对象和对象组合,使得代码更加灵活和可维护。组合模式常常用于处理复杂的层次结构,如文件系统、组织结构等。但需要注意,在某些情况下,组合模式可能会引入复杂性,因此需要谨慎使用。

相关文章:

设计模式-组合模式(Composite)

文章目录 前言一、组合模式的概念二、组合模式的优缺点1.优点2.缺点 三、组合模式的实现总结 前言 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树状结构以表示“整体-部分”的层次结构。组合模式使得客户端可以统…...

架构核心技术之微服务架构

小熊学Java&#xff1a;https://www.javaxiaobear.cn/&#xff0c;文末有免费资源 本文我们来学习微服务的架构设计 主要包括如下内容。 单体系统的困难&#xff1a;编译部署困难、数据库连接耗尽、服务复用困难、新增业务困难。 微服务框架&#xff1a;Dubbo 和 Spring Clou…...

SQL Server2022版+SSMS安装教程(保姆级)

SQL Server2022版SSMS安装教程&#xff08;保姆级&#xff09; 一&#xff0c;安装SQL Server数据库 1.下载安装包 &#xff08;1&#xff09;百度网盘下载安装包 链接&#xff1a;https://pan.baidu.com/s/1A-WRVES4EGv8EVArGNF2QQ?pwd6uvs 提取码&#xff1a;6uvs &…...

go语言基础---8

Http请求报文格式分析 package mainimport ("fmt""net" )func main() {//监听listener, err : net.Listen("tcp", ":8000")if err ! nil {fmt.Println("listener err", err)return}defer listener.Close()//阻塞等待用户的…...

Oracle的 dblink 学习笔记

文章目录 一、基础环境二、适用场景三、过程和方法四、参考资料 版权声明&#xff1a;本文为CSDN博主「杨群」的原创文章&#xff0c;遵循 CC 4.0 BY-SA版权协议&#xff0c;于2023年9月10日首发于CSDN&#xff0c;转载请附上原文出处链接及本声明。 原文链接&#xff1a;http…...

任意文件上传

1.任意文件上传概述 1.1 漏洞成因 服务器配置不当&#xff0c;开启了PUT 方法。 Web 应用开放了文件上传功能&#xff0c;没有对上传的文件做足够的限制和过滤。在程序开发部署时&#xff0c;没有考虑以下因素&#xff0c;导致限制被绕过&#xff1a; 代码特性 组件漏洞&am…...

【Unity3D】UI Toolkit自定义元素

1 前言 UI Toolkit 支持通过继承 VisualElement 实现自定义元素&#xff0c;便于通过脚本控制元素。另外&#xff0c;UI Toolkit 也支持将一个容器及其所有子元素作为一个模板&#xff0c;便于通过脚本复制模板。 如果读者对 UI Toolkit 不是太了解&#xff0c;可以参考以下内容…...

layui手机端使用laydate时间选择器被输入法遮挡的解决方案

在HTML中&#xff0c;你可以使用input元素的readonly属性来禁止用户输入&#xff0c;但是这将完全禁用输入&#xff0c;而不仅仅是禁止弹出输入法。如果你想允许用户在特定条件下输入&#xff0c;你可以使用JavaScript来动态地切换readonly属性。 readonly属性 增加readonly属…...

MVSNet CVPR-2018 学习总结笔记 译文 深度学习三维重建

文章目录 2 MVSNet CVPR-20182.0 主要特点2.1 过程2.2 MVSNet主要贡献2.3 论文简介2.3.1 深度特征提取2.3.2 构造匹配代价2.3.3 代价累计2.3.4 深度估计2.3.5 深度图优化2.4 MVSNet(pytorch版本)2 MVSNet CVPR-2018 MVSNet (pytorch版) 代码注释版 下载 (注释非常详细,代码…...

Kafka/Spark-01消费topic到写出到topic

1 Kafka的工具类 1.1 从kafka消费数据的方法 消费者代码 def getKafkaDStream(ssc : StreamingContext , topic: String , groupId:String ) {consumerConfigs.put(ConsumerConfig.GROUP_ID_CONFIG , groupId)val kafkaDStream: InputDStream[ConsumerRecord[String, Strin…...

【算法与数据结构】98、LeetCode验证二叉搜索树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;注意不要落入下面你的陷阱&#xff0c;笔者本来想左节点键值<中间节点键值<右节点键值即可&…...

关于GitHub Desktop中的“Open in Git Bash”无法使用的问题

问题描述 在GitHub Desktop中选择Repository--Open in Git Bash&#xff08;如图1&#xff09;&#xff0c;出现如图2所示结果。 图1 图2 解决办法&#xff08;Windows10&#xff09; 这个问题是由于Git的环境变量没有得到正确配置所导致的&#xff0c;所以需要正确设置环境变量…...

使用DeepSpeed加速大型模型训练(二)

使用DeepSpeed加速大型模型训练 在这篇文章中&#xff0c;我们将了解如何利用Accelerate库来训练大型模型&#xff0c;从而使用户能够利用DeeSpeed的 ZeRO 功能。 简介 尝试训练大型模型时是否厌倦了内存不足 (OOM) 错误&#xff1f;我们已经为您提供了保障。大型模型性能非…...

ASP.net web应用 GridView控件常用方法

GridView 控件是 ASP.NET Web Forms 中常用的数据展示控件之一。它提供了一个网格形式的表格&#xff0c;用于显示和编辑数据。GridView 控件对于包含大量数据、需要进行分页、排序和筛选的情况非常有用。 GridView 控件的主要特性包括&#xff1a; 数据绑定&#xff1a;GridV…...

MATLAB入门一基础知识

MATLAB入门一基础知识 此篇为课程学习笔记 链接: link 什么是MATLAB 平时所说的MATLAB既是一款软件又是一种编程语言&#xff0c;只是这种高级解释性语言是在配套的软件下进行开发的 MATLAB的一个特性 MATLAB的一个特性&#xff0c;如果一条语句以英文分号‘;’结尾&…...

SpringMVC实现文件上传和下载功能

文件下载 ResponseEntity用于控制器方法的返回值类型&#xff0c;该控制器方法的返回值就是响应到浏览器的响应报文。具体步骤如下&#xff1a; 获取下载文件的位置&#xff1b;创建流&#xff0c;读取文件&#xff1b;设置响应信息&#xff0c;包括响应头&#xff0c;响应体以…...

CHS零壹视频恢复程序OCR使用方法

目前CHS零壹视频恢复程序监控版、专业版、高级版已经支持了OCR&#xff0c;OCR是一种光学识别系统&#xff0c;通俗说就和扫描仪带的OCR软件一样的原理&#xff1a; 分析照片->OCR获取字符串->整理字符串->输出 使用方法如下&#xff08;以CHS零壹视频恢复程序监控版…...

云备份——服务端客户端联合测试

一&#xff0c;准备工作 服务端清空备份文件信息、备份文件夹、压缩文件夹 客户端清空备份文件夹 二&#xff0c;开始测试 服务端配置文件 先启动服务端和客户端 向客户端指定文件夹放入稍微大点的文件&#xff0c;方便后续测试断点重传 2.1 上传功能测试 客户端自动上传成功…...

L2 数据仓库和Hive环境配置

1.数据仓库架构 数据仓库DW主要是一个用于存储&#xff0c;分析&#xff0c;报告的数据系统。数据仓库的目的是面向分析的集成化数据环境&#xff0c;分析结果为企业提供决策支持。-DW不产生和消耗数据 结构数据&#xff1a;数据库中数据&#xff0c;CSV文件 直接导入DW非结构…...

【iOS】MVC

文章目录 前言一、MVC各层职责1.1、controller层1.2、model层1.3、view层 二、总结三、优缺点3.1、优点3.2、缺点 四、代码示例 前言 MVC模式的目的是实现一种动态的程序设计&#xff0c;使后续对程序的修改和扩展简化&#xff0c;并且使程序某一部分的重复利用成为可能。除此…...

面试官问起Python高级特性,我用这7个知识点让他闭嘴惊艳

从浅拷贝到装饰器&#xff0c;一文搞定Python高级语法核心要点在Python面试中&#xff0c;高级语法往往是区分初级和中级开发者的分水岭。很多人在写Python代码时&#xff0c;只停留在基础语法层面&#xff0c;但对于浅拷贝与深拷贝的区别、迭代器与生成器的原理、闭包与装饰器…...

Asian Beauty Z-Image Turbo环境配置:Python 3.10+torch 2.3+transformers 4.41全版本清单

Asian Beauty Z-Image Turbo环境配置&#xff1a;Python 3.10torch 2.3transformers 4.41全版本清单 Asian Beauty Z-Image Turbo是一款基于通义千问Tongyi-MAI Z-Image底座模型和Asian-beauty专用权重开发的本地东方美学图像生成工具。它采用BF16精度加载和权重注入方式部署&a…...

Typora与Markdown:优雅撰写MogFace-large技术文档与实验笔记

Typora与Markdown&#xff1a;优雅撰写MogFace-large技术文档与实验笔记 1. 引言 你有没有遇到过这种情况&#xff1a;花了好几天跑完一个复杂的MogFace-large实验&#xff0c;结果要写报告时&#xff0c;面对一堆杂乱的截图、代码片段和实验数据&#xff0c;完全不知道从哪里开…...

SAM 3图像视频分割:5分钟快速部署,新手也能轻松上手

SAM 3图像视频分割&#xff1a;5分钟快速部署&#xff0c;新手也能轻松上手 1. 模型简介 SAM 3&#xff08;Segment Anything Model 3&#xff09;是Meta推出的新一代图像和视频分割基础模型。相比前代产品&#xff0c;它最大的突破在于支持概念提示分割&#xff08;Promptab…...

FPGA实战:如何避免快时钟域信号同步到慢时钟域时的数据丢失?

FPGA跨时钟域信号同步&#xff1a;快时钟域到慢时钟域的数据完整性保障策略 在FPGA设计领域&#xff0c;跨时钟域(CDC)信号同步是一个永恒的技术挑战。当信号需要从快时钟域传递到慢时钟域时&#xff0c;工程师们常常面临数据丢失的困扰——脉冲被"吞没"&#xff0c;…...

WuliArt Qwen-Image Turbo惊艳图集:低光照场景下噪点抑制与动态范围保留能力

WuliArt Qwen-Image Turbo惊艳图集&#xff1a;低光照场景下噪点抑制与动态范围保留能力 在图像生成领域&#xff0c;低光照场景一直是个不小的挑战。光线不足、明暗对比强烈&#xff0c;这些条件很容易让生成的图片出现恼人的噪点&#xff0c;或者丢失暗部和高光的细节&#…...

Gemma-3-270m入门必学:140+语言识别能力与本地化提示词写法

Gemma-3-270m入门必学&#xff1a;140语言识别能力与本地化提示词写法 1. 开篇&#xff1a;认识这个多语言小能手 如果你正在寻找一个既轻量又强大的多语言文本生成模型&#xff0c;Gemma-3-270m绝对值得你关注。这个来自谷歌的模型虽然只有2.7亿参数&#xff0c;但能力却不容…...

新手必看:Ollama安装translategemma-27b-it图文翻译模型完整教程

新手必看&#xff1a;Ollama安装translategemma-27b-it图文翻译模型完整教程 1. 准备工作与环境搭建 1.1 了解translategemma-27b-it模型 translategemma-27b-it是Google基于Gemma 3架构开发的多模态翻译模型&#xff0c;具有以下特点&#xff1a; 支持55种语言的文本和图片…...

SAP T-CODE实用指南:从开发到运维的高效事务代码解析

1. SAP T-CODE入门&#xff1a;事务代码的本质与核心价值 第一次接触SAP系统的人&#xff0c;往往会被满屏的字母数字组合搞得晕头转向。这些看似随机的代码&#xff0c;其实是SAP系统的核心导航工具——事务代码&#xff08;Transaction Code&#xff0c;简称T-CODE&#xff0…...

OpenClaw 的模型版本更新策略是什么?是否支持在线无感升级和 A/B 测试?

在多智能体协作这个领域里&#xff0c;OpenClaw 的设计思路其实挺有意思的。它不像那种把所有功能都塞进一个庞大系统的做法&#xff0c;而是更倾向于一种“各司其职&#xff0c;互通有无”的协作模式。要理解它怎么和其他智能体通信、怎么分解任务&#xff0c;不妨先抛开那些复…...