从家谱的层级结构 - 组合模式(Composite Pattern)

组合模式(Composite Pattern)

  • 组合模式(Composite Pattern)
    • 组合模式概述
    • 组合模式涉及的角色
    • talk is cheap, show you my code
    • 总结

组合模式(Composite Pattern)

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式使得客户代码可以统一地处理单个对象和对象组合,即无论是叶子节点还是包含其他组件的容器节点,都可以以相同的方式进行操作。

有点抽象
简单点说就是这种设计经常用于树形结构,为了简化代码,使用Composite可以把一个叶子节点与一个父节点统一起来处理。
在这里插入图片描述
比如家谱,我们就能明显看出层次结构。而且我们可以任意选一个人作为祖宗节点,这样选了任何一个人为祖宗的时候,都能拉出一份相似的层次结构。

组合模式概述

  1. 定义: 组合多个对象形成树状结构以表示“部分-整体”的层次结构。组合模式让客户端可以一致地使用单个对象和组合。
  2. 目的: 简化客户端代码对复杂层次结构的操作,同时保持良好的扩展性和灵活性。

组合模式涉及的角色

  1. Component(组件接口):定义组合中的对象的行为接口,声明一个公共接口用于访问及管理其子组件。可以是抽象类或接口。
  2. Leaf(叶对象):在组合中表示叶子节点对象,叶子节点没有子节点。
  3. Composite(组合对象):在组合中表示容器对象,可以包含子组件,并可以在子组件上执行组合操作。
    在这里插入图片描述

talk is cheap, show you my code

我们还是通过把我们举得那个案例转化成代码从而方便我们了解组合设计模式

  1. 组件(Component), 这个地方我们因为使用家谱信息,所以我们定义结构名为Family
public interface Family{// 所有组件都应实现的基本操作 我们这个案例主要指的是展示从自己开始的家族信息void show(); 
}
  1. 叶子(Leaf),这个地方指的是具体的一个个子Family
public class Afamily implements Family{@Overridepublic void show() {System.out.println("Afamily");}
}
public class Bfamily implements Family{@Overridepublic void show() {System.out.println("Bfamily");}
}
  1. 组合(Composite),代表树形结构中的非终端节点,它可以包含零个或多个子组件,因为组合也实现了对应的接口,所以组合不光可以加叶子节点,还可以把其他的组合添加到另一个组合中去。
public class FamilyComposite implements Family{private List<Family> children = new ArrayList<>();@Overridepublic void show() {System.out.println("show my family");for (Family child : children) {child.show();}}public void add(Family family) {children.add(component);}public void remove(Family family) {children.remove(component);}public List<Family> getChildren() {return children;}
}

总结

组合模式优点:

  1. 一致性:客户端可以一致地对待单个对象和组合对象,不需要关心它们的具体类型。
  2. 灵活性:很容易通过组合模式构建复杂的树形结构,并且可以在不影响现有代码的情况下增加新的组件。
  3. 符合开闭原则:当需要添加新类型的组件时,只需创建一个新的叶子或组合类,而无需修改现有的代码。
  4. 易于扩展:由于每个组件都是独立的,因此可以很容易地为特定类型的组件添加新的行为或属性。

应用场景:

  • 文件系统:如操作系统中的目录和文件,其中目录可以包含其他目录或文件,而文件是终端节点。
  • 图形界面设计:例如窗口中的菜单项,菜单本身可能包含子菜单或具体的菜单选项(叶子)。
  • 组织架构:如公司内部的部门和员工,部门可以包含子部门或其他员工。
  • 文档编辑器:如文本块、段落、章节等,其中章节可以包含多个段落,段落又可以包含多个文本块。

组合模式是一个非常有用的设计模式,特别是在需要处理具有层次结构的数据时。它可以帮助开发者更好地组织代码,提高系统的灵活性和可扩展性。其实我们平时解析Xml的过程中,就有组合模式,因为Xml实际上也是一颗树结构。如果有兴趣的同学可以去阅读一下解析XML的库函数的源码。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 DINOv2 模型实现图搜图相似度检索任务

一、DINOv2 模型简介及使用 DINOv2是由Meta AI开发的第二代自监督视觉变换器模型&#xff0c;采用 Vision Transformer (ViT) 架构 。其核心特点是在无需人工标签的情况下&#xff0c;通过自监督学习技术&#xff0c;从海量无标注图像中学习有意义的视觉特征表示&#xff0c;类…

STM32高级 以太网通讯案例1:网络搭建(register代码)

需求描述 驱动W5500芯片&#xff0c;设置好IP&#xff0c;测试网络是否连通。 思考&#xff1a; 驱动W5500芯片是通过spi协议&#xff0c;所以和spi相关的有四个引脚&#xff0c;MOSI&#xff08;主出从入&#xff09;MISO&#xff08;主入从出&#xff09;SCK&#xff08;时…

详解VHDL如何编写Testbench

1.概述 仿真测试平台文件(Testbench)是可以用来验证所设计的硬件模型正确性的 VHDL模型&#xff0c;它为所测试的元件提供了激励信号&#xff0c;可以以波形的方式显示仿真结果或把测试结果存储到文件中。这里所说的激励信号可以直接集成在测试平台文件中&#xff0c;也可以从…

【数据结构】单链表的使用

单链表的使用 1、基本概念2、链表的分类3、链表的基本操作a、单链表节点设计b、单链表初始化c、单链表增删节点**节点头插&#xff1a;****节点尾插&#xff1a;****新节点插入指定节点后&#xff1a;**节点删除&#xff1a; d、单链表修改节点e、单链表遍历&#xff0c;并打印…

浅谈某平台多场景下反爬虫与风控业务

文章目录 1. 写在前面2. 内容反爬3. 账号风控3. 接口验签 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

如何在网页端使用 IDE 高效地阅读 GitHub 源码?

如何在网页端使用 IDE 高效地阅读 GitHub 源码&#xff1f; 前言什么是 GitHub1s&#xff1f;使用 GitHub1s 阅读 browser-use 项目源码步骤 1: 打开 GitHub 项目页面步骤 2: 修改 URL 使用 GitHub1s步骤 3: 浏览文件结构步骤 4: 使用代码高亮和智能补全功能步骤 5: 快速跳转和…

Web Bluetooth API 开发记录

搞了一天的蓝牙串口协议被几个软件和AI带沟里面去了。 1.00001101-0000-1000-8000-00805f9b34fb 是spp协议。但是我用的称是使用的49535343-fe7d-4ae5-8fa9-9fafd205e455蓝牙低功耗spp协议 2.推荐一款软件Android-nRF-Connect github地址&#xff1a;https://github.com/Nor…

使用VS Code开发ThinkPHP项目

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 ThinkPHP 8开发环境安装-CSDN博客 安装ThinkPHP项目的IDE 常用的集成开发环境&#xff08;IDE&#xff09;包括P…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

???欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

Windows上缺少xaudio2_9.dll是什么原因?

一、文件丢失问题&#xff1a;Windows上缺少xaudio2_9.dll是什么原因&#xff1f; xaudio2_9.dll是DirectX音频处理库的一个组件&#xff0c;它支持游戏中的音频处理功能。当你在Windows系统上运行某些游戏或音频软件时&#xff0c;如果系统提示缺少xaudio2_9.dll文件&#xf…

缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布

近期&#xff0c;JuiceFS 企业版推出了 Cache Group Operator&#xff0c;用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具&#xff0c;它能够自动化应用程序的生命周期管理任务&#xff0c;使部署、扩展和运维更加高效。 在推出 Operator 之前…

SCSA:探索空间与通道注意力之间的协同效应

文章目录 摘要1 引言2 相关工作2.1 多语义空间信息2.2 注意力分解 3 方法3.1 共享多语义空间注意力&#xff1a;空间与通道分解3.2 渐进式通道自注意力3.3 协同效应3.4 注意力机制的整合 4 实验4.1 实验设置4.2 图像分类4.3 目标检测4.4 分割4.5 消融研究 5 可视化与分析5.1 注…

Grok 2.0:马斯克的大模型挑战ChatGPT,AI竞争再升级

引言&#xff1a;马斯克Grok 2.0的横空出世 在人工智能&#xff08;AI&#xff09;领域&#xff0c;竞争从未停止。随着大型语言模型&#xff08;LLM&#xff09;的快速发展&#xff0c;各大科技巨头纷纷推出自己的AI模型&#xff0c;试图在激烈的竞争中占据领先地位。最近&am…

基于Spring Boot的宠物领养系统的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领…

安卓15预置第三方apk时签名报错问题解决

有同事反馈集成apk时安装失败 PackageManager: Failed to scan /product/app/test: No APK Signature Scheme v2 signature in package /product/app/test/test.apk 查看编译后的apk签名信息 DOES NOT VERIFY ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.SF indi…

从0入门自主空中机器人-2-1【无人机硬件框架】

关于本课程&#xff1a; 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程&#xff0c;包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程&#xff0c;带你从0开始&#xff0c;组装属于自己的自主无人机&#xff0c;并让…

实现某海外大型车企(T)Cabin Wi-Fi 需求的概述 - 4

大家好&#xff0c;我是Q&#xff0c;邮箱&#xff1a;1042484520qq.com。 今天我们在上几讲的基础上再扩展下 Cabin Wi-Fi 的功能需求&#xff0c;讲讲如何使能 5G TCU Wi-Fi STA Bridge 模式。 参考&#xff1a; 实现某海外大型车企&#xff08;T&#xff09;Cabin Wi-Fi 需求…

2024 年最新 windows 操作系统搭建部署 nginx 服务器应用详细教程(更新中)

nginx 服务器概述 Nginx 是一款高性能的 HTTP 和 反向代理 服务器&#xff0c;同时是一个 IMAP / POP3 / SMTP 代理服务器。Nginx 凭借其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。 浏览 nginx 官网&#xff1a;https://nginx.org/ Nginx 应用场景 静态…

C 实现植物大战僵尸(二)

C 实现植物大战僵尸&#xff08;二&#xff09; 前文链接&#xff0c;C 实现植物大战僵尸&#xff08;一&#xff09; 五 制作启动菜单 启动菜单函数 void startUI() {IMAGE imageBg, imgMenu1, imgMenu2;loadimage(&imageBg, "res/menu.png");loadimage(&am…

Android笔记(四十一):TabLayout内的tab不滚动问题

背景 假设二级页面是上面图片的布局&#xff0c;当进来时TabLayout和ViewPager2绑定完就马上调setCustomItem&#xff0c;跳转到最后一个tab页面时&#xff0c;会发现tab不滚动&#xff0c;手动滑一下ViewPager2时才会滚动tab到正确的位置 原因分析 调用TabLayoutMediator.at…