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

组合模式简绍

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样,可以在不知道对象具体类型的条件下操作对象集合。

组合模式主要包含三种角色:

  • Component(组件):声明一个接口,在适当情况下,此接口被叶节点和容器节点共享。
  • Leaf(叶节点):定义终端对象。
  • Composite(容器节点):定义具有子部件的那些部件的行为。存储子部件。 组合模式的应用场景

组合模式的优缺点

组合模式的优点
  • 一致性:客户端可以一致地处理单个对象和组合对象。
  • 灵活性:可以很容易地添加新的叶子节点或组合节点。
  • 透明性:客户端不需要知道对象的具体类型就可以操作对象。
组合模式的缺点
  • 复杂性:对于简单操作,组合模式可能会引入不必要的复杂性。
  • 额外开销:组合模式可能会导致额外的内存和 CPU 开销,尤其是在处理大量对象时

UML图

在这里插入图片描述

定义一个公共接口或抽象类,它声明了所有叶子节点和容器节点共有的操作。

package CompositePatternModel;public interface Component {void test();Component getChild(int i);public void operation();public void add(Component component);
}

实现 Component 接口中定义的操作,但不关心其他与子节点相关的操作。

package CompositePatternModel;import java.util.ArrayList;
import java.util.List;public class Composite implements Component{private String name;private List<Component> children = new ArrayList<>();public Composite(String name){this.name = name;}@Overridepublic void test() {}@Overridepublic Component getChild(int i) {return children.get(i);}@Overridepublic void operation() {System.out.println("Composite " + name + " operation");for (Component c : children) {c.operation();}}@Overridepublic void add(Component component) {children.add(component);}}

实现 Component 接口中定义的操作,并且实现与子节点相关的操作。客户端可以一致地对待单个对象和组合对象。

package CompositePatternModel;public class Pattern implements  Component{private String name;public Pattern(String name){this.name = name;}@Overridepublic void test() {System.out.println("test");}@Overridepublic Component getChild(int i) {System.out.println("getChild");return null;}@Overridepublic void operation() {System.out.println("operation: d" + name);}@Overridepublic void add(Component component) {System.out.println("sdf"+ component);}}

客户端可以一致地对待单个对象和组合对象。

package CompositePatternModel;public class Main {public static void main(String[] args) {Pattern pattern = new Pattern("pattern1");Pattern pattern1 = new Pattern("pattern2");Composite composite = new Composite("Comp");composite.add(pattern);composite.add(pattern1);composite.operation();}
}
  1. 表示部分-整体层次结构
    当你需要表示一个具有层次结构的对象集合时,组合模式是非常有用的。这种结构通常包含多个层次,每个层次上的对象可以是一个独立的实体(叶节点),也可以是一个包含其他对象的容器(组合节点)。
    示例:

    • 文件系统中的目录和文件:目录可以包含其他目录和文件。
    • 组织结构图:部门可以包含其他部门或员工。
    • UI控件:一个复合控件可以包含其他控件(如面板包含按钮、文本框等)
  2. 透明地处理单个对象和组合对象
    当客户端代码需要以一致的方式处理单个对象和组合对象时,组合模式可以让客户端无需关心处理的是单个对象还是组合对象。
    示例:

    • 图形编辑器:图形可以是单独的线条、矩形等基本图形,也可以是由多个基本图形组成的复合图形。
    • 渲染引擎:渲染对象可以是单一的几何体,也可以是由多个几何体组成的复杂场景。
  3. 动态地增删对象
    当需要在运行时动态地添加或移除对象,并且这些对象可能是单个实体也可能是包含其他对象的容器时,组合模式可以很好地支持这种需求。

    示例:
    游戏中的场景管理:游戏场景可以包含单个游戏对象,也可以包含其他场景。
    UI 界面构建:一个窗口可以包含多个面板,每个面板又可以包含多个组件。

  4. 需要递归处理的对象集合
    当需要对一个层次结构进行递归处理时,组合模式可以简化递归逻辑。
    示例:

    • 企业组织结构的遍历:遍历整个公司的部门和员工。
    • 文件系统的遍历:递归地遍历目录和文件。
  5. 需要一致的接口
    当希望在不同类型的对象之间提供一致的接口时,组合模式可以确保所有的对象(无论是叶子还是组合节点)都遵循相同的接口定义。

示例:
操作系统中的文件和目录:文件和目录都需要支持读写、删除等操作。
网页中的 DOM 结构:DOM 节点可以是文本节点也可以是包含其他节点的元素节点。

组合模式提供了一种优雅的方式来组织和操作层次结构中的对象,使得客户端可以在不知道对象具体类型的情况下操作对象集合。这种模式在很多领域都有广泛的应用,特别是在需要表示层次关系的场景中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1537806.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Python百日进阶-Web开发-FastAPI】Day801 - FastAPI是什么

文章目录 一、官网二、FastAPI是什么三、FastAPI特性3.1 基于开放标准3.2 自动生成文档3.3 更主流的 Python3.4 编辑器支持3.5 简洁3.6 验证3.7 安全性及身份验证3.8 依赖注入3.9 无限制"插件"3.10 测试四、Starlette 特性五、Pydantic 特性六、Python 类型提示简介6…

数据结构—队列

队列 概念 只允许在一端进行插入数据的操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out)。 入队列&#xff1a;进行插入操作的一端称为队尾。 出队列&#xff1a;进行删除操作的一端称为队头。 结构 队列也可以数组…

【前端】prop传值的用法

prop配置项的作用是让组件接收外部传过来的值。 组件标签上传值给vue组件对象 <script> export default {name: HelloWorld,data(){return{ }},props:[name,age] #简单接收 } </script>方式2:利用对象方式设置数据类型进行类型限制 props:{name:String…

《探索云原生与相关技术》

在当今的科技领域中&#xff0c;云原生&#xff08;Cloud Native&#xff09;已经成为了一个热门的话题。它代表着一种构建和运行应用程序的全新方式。 云原生的概念 云原生是一套技术体系和方法论&#xff0c;旨在充分利用云计算的优势来构建更具弹性、可扩展性和高效性的应…

开源 AI 智能名片与微信拓客小程序:基于人性洞察的内容营销新策略

摘要&#xff1a;本文分析了刷屏社交事件所呈现出的特征以及背后反映出的碎片时代人们的行为特点。通过引入网络人格三角形模型&#xff0c;探讨了人性特征在内容营销中的应用。结合开源 AI 智能名片与微信拓客小程序&#xff0c;提出了利用人性特点进行内容设计和传播规划的策…

2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】

目录 数据结构王道第2章之顺序表 顺序表的定义和基本操作 定义&#xff1a; 基本操作&#xff1a; 基本操作&#xff1a; ​编辑 顺序表的实现-静态分配​编辑 顺序表的静态分配初始化 如果“数组”存满了怎么办&#xff1a; 顺序表的实现-动态分配&#xff1a; ​编辑 顺序表…

java日志框架之JUL(Logging)

文章目录 一、JUL简介1、JUL组件介绍 二、Logger快速入门三、Logger日志级别1、日志级别2、默认级别info3、原理分析4、自定义日志级别5、日志持久化&#xff08;保存到磁盘&#xff09; 三、Logger父子关系四、Logger配置文件 一、JUL简介 JUL全程Java Util Logging&#xff…

【复刻】数字化转型是否促进了企业内共同富裕? —来自中国 A 股 (2002-2022年)

【顶刊复刻】数字化转型是否促进了企业内共同富裕?———来自中国 A 股上市公司的证据&#xff08;2002-2022&#xff09; 一、数据简介 本数据参考方明月等&#xff08;2023&#xff09;的研究方法&#xff0c;对原文数据进行了年份扩充&#xff0c;更新到了2003-2022年。并…

【例题】lanqiao4425 咖啡馆订单系统

样例输入 3 2 2 1 3 1 2样例输出 3 2样例说明 输入的数组为&#xff1a;【3&#xff0c;1&#xff0c;2】 增量序列为&#xff1a;【2&#xff0c;1】 当增量 h2&#xff1a;对于每一个索引 i&#xff0c;我们会将数组元素 arr[i] 与 arr[i−h] 进行比较&#xff0c;并进行可…

Qt构建JSON及解析JSON

目录 一.JSON简介 JSON对象 JSON数组 二.Qt中JSON介绍 QJsonvalue Qt中JSON对象 Qt中JSON数组 QJsonDocument 三.Qt构建JSON数组 四.解析JSON数组 一.JSON简介 一般来讲C类和对象在java中是无法直接直接使用的&#xff0c;因为压根就不是一个规则。但是他们在内存中…

我一进门就看见 AI 在啪啪啪狂敲代码

不知道小伙伴们有没有关注到最近又有一个超级火热的 AI 工具&#xff0c;叫做 Cursor AI。 松哥体验了一把&#xff0c;感觉以后能从画页面的桎梏中解脱出来了。 松哥来和小伙伴们演示一下这个工具的玩法。 一 Cursor IDE Cursor 是一款集成了 AI 编程辅助功能的新型 IDE&a…

探索 Python 的火焰:Fire 库的神秘力量

文章目录 &#x1f525; 探索 Python 的火焰&#xff1a;Fire 库的神秘力量第一部分&#xff1a;背景介绍第二部分&#xff1a;Fire 库是什么&#xff1f;第三部分&#xff1a;如何安装 Fire&#xff1f;第四部分&#xff1a;简单库函数使用方法第五部分&#xff1a;场景应用第…

NASA:ATLAS/ICESat-2 L3 A陆地冰高度,版本6

目录 简介 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3A Land Ice Height V006 ATLAS/ICESat-2 L3 A陆地冰高度&#xff0c;版本6 简介 该数据集&#xff08;ATL06&#xff09;提供了地理定位的陆冰表面高度&#xff08;WGS 84椭球面之上&a…

react hooks--useContext

概述 ◼ 在之前的开发中&#xff0c;我们要在组件中使用共享的Context有两种方式&#xff1a;  类组件可以通过 类名.contextType MyContext方式&#xff0c;在类中获取context&#xff1b; 多个Context或者在函数式组件中通过 MyContext.Consumer 方式共享context&…

ThreadX源码:Cortex-A7的tx_thread_irq_nesting_start(嵌套中断开始动作).s汇编代码分析

0 参考资料 Cortex M3权威指南(中文).pdf&#xff08;可以参考ARM指令集用法&#xff09; 1 前言 tx_thread_irq_nesting_start.s是用来实现Cortex-A7 IRQ嵌套中断的开始函数实现的汇编文件。 2 源码分析 源码如下&#xff1a; &#xff11;  IRQ_DISABLE 0x80…

文本多语言 AI 摘要 API 数据接口

文本多语言 AI 摘要 API 数据接口 文本 / 文本摘要 AI 生成文本摘要 AI 处理 / 智能摘要。 1. 产品功能 支持多语言摘要生成&#xff1b;支持长文本处理&#xff1b;基于 AI 模型&#xff0c;持续迭代优化&#xff1b;不存储 PDF 文件&#xff0c;处理完即释放&#xff0c;保…

讲个故事5.0

一、DORL的输入 1.1 训练集 训练集共有两个&#xff0c;分别为dataset_train和train_collector。dataset_train用于训练用户模型&#xff0c;即训练论文图6中的GPM&#xff0c;该训练过程有验证集无测试集&#xff1b;train_collector用于学习策略&#xff0c;即学习论文图6中…

ollama安装(ubuntu20.04)

Ollama是一款开源的自然语言处理工具&#xff0c;它可以帮助开发者快速构建文本处理应用。 ollama官网: https://ollama.ai/ 一、ollama 自动安装 linux统一采用sh脚本安装&#xff0c;一个命令行搞定。 curl -fsSL https://ollama.com/install.sh | sh二、ollama 手动安装 o…

springboot实战学习笔记(2)

目录 1、手动创建springboot工程&#xff0c;选择Maven构建。 2、Maven生成的&#xff0c;可能需要再main目录下new一个resources目录&#xff0c;再在其下目录new一个配置文件。 3、 pom文件中让当前的工程继承父工程依赖&#xff1a;、删去无用依赖。 4、引入后端环境所需要的…

Chainlit集成Langchain并使用通义千问AI知识库高级检索(多重查询)网页对话应用教程

前言 之前写过几篇利用Chainlit集成Langchain和国内通义千问大模型集成的知识库检索增加的网页对话应用的技术文章。文章中关于Langchain的知识库检索只是入门级别的教学&#xff0c;本篇文章针对Langchain的知识库高级检索技术和之前对话应用的代码进行完善。 本次主要改进的…