组合模式

news/2026/1/14 21:29:14/文章来源:https://www.cnblogs.com/qiixunlu/p/19423811

1.模式动机与定义

模式动机

在树形目录结构中,包含文件和文件夹两类不同的元素

  • 在文件夹中可以包含文件,还可以继续包含子文件夹
  • 在文件中不能再包含子文件或者子文件夹

文件夹——>容器(Container)

文件——>叶子(Leaf)

模式定义

  1. 组合模式(Composite Pattern):组合多个对象形成树形结构表示“部分整体”的结构层次。组合模式对单个对象(即叶子对象)组合对象(即容器对象)的使用具有一致性。
  2. 对象结构型模式
  3. 将对象组织到树形结构中,可以用来描述整体与部分的关系

2.模式结构与分析

模式结构

组合模式包含如下角色

  1. Component: 抽象构件:抽象构件可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法。如增加、删除、获取等。
  2. Leaf: 叶子构件:叶子构件在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。
  3. Composite:容器构件:容器构件在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点。它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为。包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。
  4. Client: 客户类:客户类可以通过抽象构件接口访问和控制组合构件中的对象

模式分析

组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。

同时容器对象与抽象构件类之间还建立一个聚合关联关系,在容器对象中既可以包含叶子,也可以包含容器,以此实现递归组合,形成一个树形结构

//典型的抽象构件角色代码
public abstract class Component{public abstract void add(Component c);public abstract void remove(Component c);public abstract Component getChild(int i);public abstract void operation();
}//典型的叶子构件角色代码
public class Leaf extends Component{public void add(Component c){//异常处理或错误提示}public void remove(Component c){//异常处理或错误提示}public Component getChild(int i){//异常处理或错误提示}public void operation(){//实现代码}
}//容器构件示例代码
public class Composite extends Component {private ArrayList<Component> list=new ArrayList<Component>();public void add(Component c){list.add(c);}public void remove(Component c){list.remove(c);}public Component getChild(int i){return (Component)list.get(i);}public void operation(){//容器构件具体业务方法的实现,将递归调用成员构件的业务方法for(Object obj:list){((Component)obj).operation();}}
}

透明组合模式

  • 抽象构件Component中声明了所有用于管理成员对象的方法,包括add0、remove(),以及getChild()等方法
  • 在客户端看来,叶子对象与容器对象所提供的方法是一致的,客户端可以一致地对待所有的对象
  • 缺点是不够安全,因为叶子对象和容器对象在本质上是有区别的

安全组合模式

  • 抽象构件Component中没有声明任何用于管理成员对象的方法,而是在Composite类中声明并实现这些方法
  • 对于叶子对象,客户端不可能调用到这些方法
  • 缺点是不够透明,客户端不能完全针对抽象编程,必须有区别地对待叶子构件和容器构件

3.模式效果与应用

优点

  1. 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,让客户端忽略了层次的差异,方便对整个层次结构进行控制
  2. 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码
  3. 增加新的容器构件和叶子构件都很方便,符合开闭原则
  4. 树形结构的面向对象实现提供了一种灵活的解决方案

缺点

在增加新构件时很难对容器中的构件类型进行限制

使用情况

具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异客户端可以一致地对待它们

在一个使用面向对象语言开发的系统中需要处理一个树形结构

在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型

模式应用

  1. XML文档解析
  2. 操作系统中的目录结构是一个树形构,因此在对文件和文件夹进行操作时可以应用组合模式,例如杀毒软件在查毒或杀毒时,既可以针对一个具体文件,也可以针对一个目录。如果是对目录查毒或杀毒,将递归处理目录中的每一个子目录和文件
  3. JDK的AWT/Swing是组合模式在Java类库中的一个典型实际应用。

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

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

相关文章

STM32CubeMX安装教程:一文说清环境变量配置要点

STM32CubeMX启动失败&#xff1f;别急&#xff0c;先搞定Java环境变量配置 你有没有遇到过这样的情况&#xff1a;兴冲冲下载安装完STM32CubeMX&#xff0c;双击图标却毫无反应&#xff1b;或者弹出一个模糊的错误提示&#xff1a;“Missing Java Environment”、“无法找到ja…

智能车竞赛中提升openmv与stm32通信稳定性的方法

如何让OpenMV与STM32通信稳如老狗&#xff1f;——智能车竞赛实战避坑指南在智能车赛场上&#xff0c;你有没有遇到过这样的场景&#xff1a;车子跑得好好的&#xff0c;突然一个“抽风”&#xff0c;猛地往赛道外一拐&#xff0c;直接冲出边界&#xff1b;或者明明看到了十字路…

Conda list输出格式化:提取关键PyTorch依赖信息

Conda list输出格式化&#xff1a;提取关键PyTorch依赖信息 在人工智能项目开发中&#xff0c;一个常见的尴尬场景是&#xff1a;同事兴奋地告诉你他复现了某篇论文的SOTA结果&#xff0c;而你在自己的机器上运行相同代码时&#xff0c;却慢得像在用计算器训练模型。排查到最后…

Linux文件权限设置对Miniconda的影响

Linux文件权限设置对Miniconda的影响 在部署AI开发环境时&#xff0c;一个看似不起眼的细节——文件权限——常常成为阻碍conda命令执行、环境创建失败甚至Jupyter内核无法启动的“隐形杀手”。尤其当使用预配置的云镜像或Docker容器运行Miniconda-Python3.10时&#xff0c;开…

lvgl界面编辑器在温控系统中的项目应用

用 lvgl 界面编辑器打造工业级温控系统&#xff1a;从设计到落地的实战全解析你有没有经历过这样的场景&#xff1f;在开发一款数字温控仪时&#xff0c;明明控制算法已经调得八九不离十了&#xff0c;却因为界面太“简陋”被客户打回重做——按钮位置不对、字体看不清、温度曲…

Linux ulimit设置避免PyTorch打开过多文件报错

Linux ulimit 设置避免 PyTorch 打开过多文件报错 在深度学习项目中&#xff0c;一个看似不起眼的系统限制&#xff0c;往往能让训练任务在关键时刻“卡壳”。你是否遇到过这样的场景&#xff1a;模型结构已经调优&#xff0c;数据集也准备就绪&#xff0c;启动 DataLoader 后却…

GitHub Wiki维护:记录团队Miniconda使用规范

GitHub Wiki维护&#xff1a;记录团队Miniconda使用规范 在AI科研与工程开发并重的今天&#xff0c;一个常见的痛点是&#xff1a;“代码在我机器上跑得好好的&#xff0c;怎么换台机器就报错&#xff1f;” 这种“环境漂移”问题不仅浪费时间&#xff0c;更严重影响协作效率和…

HTML5 WebSockets实现实时模型预测反馈

HTML5 WebSockets实现实时模型预测反馈 在深度学习日益普及的今天&#xff0c;越来越多的应用不再满足于“输入—等待—输出”的静态交互模式。无论是教学演示中希望实时观察模型注意力的变化&#xff0c;还是工业质检场景下需要毫秒级缺陷反馈&#xff0c;传统的HTTP请求-响应…

Jupyter Notebook单元格执行顺序陷阱揭秘

Jupyter Notebook单元格执行顺序陷阱揭秘 在数据科学和机器学习项目中&#xff0c;你是否曾遇到过这样的尴尬&#xff1a;自己笔记本里运行得好好的模型训练代码&#xff0c;发给同事后却在第一行就报错“变量未定义”&#xff1f;重启内核再点“全部运行”&#xff0c;居然也失…

Jupyter Notebook密码保护设置防止数据泄露

Jupyter Notebook密码保护设置防止数据泄露 在云计算和远程开发日益普及的今天&#xff0c;一个看似无害的操作——启动 Jupyter Notebook 服务时未设防护——可能让整个服务器暴露在公网之下。某 AI 实验室曾因在 AWS 上运行 jupyter notebook --ip0.0.0.0 而未配置任何认证机…

新手教程:基于单片机的蜂鸣器电路设计实战案例

从“嘀”一声开始&#xff1a;手把手教你用单片机驱动蜂鸣器 你有没有想过&#xff0c;家里的微波炉“叮”一声是怎么来的&#xff1f;电梯到楼时的提示音、智能门锁的错误警报、甚至儿童玩具的音乐……背后往往都藏着一个不起眼的小元件—— 蜂鸣器 。 别看它小&#xff0c…

SSH批量管理多台GPU服务器脚本编写

SSH批量管理多台GPU服务器脚本编写 在深度学习项目日益复杂的今天&#xff0c;一个团队可能需要同时维护数十台搭载高性能GPU的远程服务器。每当新成员加入、模型版本更新或训练任务重启时&#xff0c;运维人员就得登录每一台机器手动检查环境、同步代码、启动服务——这种重复…

Miniconda环境快照备份与恢复方案

Miniconda环境快照备份与恢复方案 在数据科学和AI开发的实际工作中&#xff0c;你是否遇到过这样的场景&#xff1a;昨天还能正常运行的代码&#xff0c;今天却因为某个依赖包自动更新而报错&#xff1f;或者团队成员反复提问“为什么这个库我装不上”&#xff1f;又或者你在论…

HTML Canvas绘图:前端可视化大模型注意力机制

HTML Canvas绘图&#xff1a;前端可视化大模型注意力机制 在自然语言处理实验室的某个深夜&#xff0c;研究员小李正盯着屏幕上密密麻麻的日志输出发愁。他刚训练完一个基于Transformer架构的语言模型&#xff0c;但在分析其行为时却束手无策——尽管损失值下降了&#xff0c;但…

8051单片机蜂鸣器报警电路proteus仿真超详细版

8051单片机驱动蜂鸣器&#xff1f;别再“点灯式”教学了&#xff0c;带你从零搭建可听、可观测的Proteus仿真系统 你有没有过这样的经历&#xff1a;学完一个单片机例程&#xff0c;代码能跑通&#xff0c;但换个引脚就不知道怎么改&#xff1b;仿真图一画出来&#xff0c;蜂鸣…

SSH连接提示Permission denied多种情况解析

SSH连接提示Permission denied多种情况解析 在现代AI开发与云计算实践中&#xff0c;远程服务器已成为不可或缺的计算载体。无论是训练深度学习模型&#xff0c;还是部署数据处理流水线&#xff0c;开发者几乎每天都要通过SSH接入远程实例。然而&#xff0c;当终端上突然跳出那…

STLink v2固件升级完整指南(附详细图解)

手把手教你升级 STLink v2 固件&#xff1a;从识别问题到成功刷写&#xff08;实战全记录&#xff09; 你有没有遇到过这样的场景&#xff1f; 在Keil里点了“Download”&#xff0c;结果弹出一行红字&#xff1a;“ No target connected ”。 或者用STM32CubeProgrammer连…

R语言中的模型汇总技巧

引言 在数据分析和统计建模中,R语言是许多研究人员和数据科学家的首选工具之一。modelsummary包为模型结果的展示提供了一个强大的工具,但有时我们需要对其默认设置进行一些调整,以满足特定的展示需求。本文将通过实际案例,展示如何使用modelsummary包中的shape参数和esti…

P8大佬内部分享,请低调使用……

上周&#xff0c;我从阿里后端面试官那里要了几套Java内部学习资料。不仅包含大量的高频面试题&#xff0c;还系统梳理了后端工程师必备的核心技能点&#xff1a;Spring Cloud 微服务架构、MySQL 底层优化、Redis 分布式缓存、如何应对HR面、如何应对项目面......想高效快速地拿…

Miniconda-Python3.10镜像优势解析:轻量、灵活、适配AI开发全流程

Miniconda-Python3.10镜像优势解析&#xff1a;轻量、灵活、适配AI开发全流程 在人工智能项目日益复杂、团队协作频繁的今天&#xff0c;一个常见却令人头疼的问题是&#xff1a;“为什么我的代码在本地能跑&#xff0c;在服务器上就报错&#xff1f;” 答案往往藏在环境差异里…