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

什么是组合模式?一文详解

一.意图

将对象组合成树型结构,以表示“部分-整体”的层次结构。组合模式使得用户对单个对象(文件,由于文件是最底层,没儿子,所以叫“单个对象”)和组合对象(文件夹,文件夹有儿子,所以叫“组合对象”)的使用具有一致性(一致性的意思是,无论是文件还是文件夹,我们创建对象时,左面的声明类型都用抽象文件表示,这是一种多态的思想,很多算法都用到了)。

核心思想:

  • 文件夹下,可以包括文件、文件夹
  • 文件就不能进行add、和remove方法了(说白了,到文件就结束了,它不可能在下面继续深入添加儿子了,因为文件就到底了。再说白了,只有文件夹才能继续添加儿子)因此具体的做法就是(首先要知道,文件作为抽象文件的子类,是一定要实现抽象文件的add和remove方法,但是文件还不能进行add和remove,因此实现add和remove方法时,直接return “文件无法执行add、remove操作”之类的特殊处理信息即可。或者add和remove的返回值类型是boolean类型,那我们直接令文件的add和remove操作的返回值都是false即可,表示文件不能进行添加、删除儿子,因为文件就是最底层,没有儿子。)

二.结构

三.举例:文件夹、文件的树状结构(操作系统的目录结构)

1.代码

①创建“抽象文件”

//抽象文件(即:可以是文件夹,也可以是文件,故称为“抽象文件”) public abstract class AbstractFile { protected String name;//抽象文件的名称(即:文件夹的名称 / 文件的名称) //打印抽象文件的名称 public void printName(){ System.out.println(name); } //添加抽象文件(true代表添加成功、false代表添加失败) public abstract boolean add(AbstractFile file); //移除抽象文件(true代表移除成功、false代表移除失败) public abstract boolean remove(AbstractFile file); //获取子抽象文件组(儿子/子组件) public abstract List<AbstractFile> getChildren(); }

②创建“文件夹”

//文件夹 public class Folder extends AbstractFile{ //当前文件夹的子抽象文件组(儿子/子组件) private List<AbstractFile> childrenList = new ArrayList<AbstractFile>(); public Folder(String name){ this.name = name; } @Override public boolean add(AbstractFile file) { return childrenList.add(file); } @Override public boolean remove(AbstractFile file) { return childrenList.remove(file); } @Override public List<AbstractFile> getChildren() { return childrenList; } }

③创建“文件”

//文件 public class File extends AbstractFile{ public File(String name){ this.name = name; } @Override public boolean add(AbstractFile file) { return false;//文件就是最底层了,不能添加儿子,所以恒为false } @Override public boolean remove(AbstractFile file) { return false;//文件就是最底层了,不能移除儿子,所以恒为false } @Override public List<AbstractFile> getChildren() { return null;//文件就是最底层,根本不可能有儿子,所以返回null } }

测试一下

public class Demo01Application { //输出整体的树状结构 static void print(AbstractFile file){ //先输出自己的名字 file.printName(); //获取儿子集合 List<AbstractFile> childrenList = file.getChildren(); if(childrenList == null) return; //遍历每个儿子 for(AbstractFile children: childrenList){ //递归调用本方法 print(children);//这里要用递归,这也是一个考点 } } public static void main(String[] args) { AbstractFile root = new Folder("root"); AbstractFile folderA = new Folder("folderA"); AbstractFile folderB = new Folder("folderB"); AbstractFile fileC = new File("fileC"); AbstractFile fileD = new File("fileD"); AbstractFile fileE = new File("fileE"); root.add(folderA); root.add(folderB); root.add(fileC); folderA.add(fileD); folderA.add(fileE); //输出树状结构 print(root); } }

我们可以先根据常识,画一下目前代码中的目录结构:

所以此时遍历输出的结果顺序(先序遍历,即:根、左、右)应该是:
root、folderA、fileD、fileE、folderB、fileC

四.软考真题

1.2009年下半年

题目

分析过程

(1)abstract

(2)null

(3)List

(4)childList

(5)printTree(file)


没啥好说的,和我们上述举的例子一模一样。

正确答案

将我们上述的答案,和下面的正确答案进行对比,发现全对了。

2.2010年下半年

题目

分析过程

(1)abstract class

注意别把class丢了

(2)this.name

(3)Company

(4)Company

(5)children

(6)children

(7)root.Add(comp)

(8)comp.Add(comp1)


这题和文件、文件夹哪个类型的题一样,都是很简单的。

正确答案

将我们上述的答案,和下面的正确答案对比,发现全对了

http://www.jsqmd.com/news/855106/

相关文章:

  • STM32串口打印的“坑”你踩过几个?从fputc重定向到解决中文乱码、数据丢失的完整指南
  • topcode【随机算法题】【2026.5.20打卡-java版本】
  • 告别.NET Framework:为什么我建议你的下一个WinForm项目直接上.NET 8?
  • 2026年彩钢瓦冷弯成型设备评测:异型冷弯成型设备、彩钢瓦冷弯成型权、数控辊压成型机、货架立柱辊压成型机、轻钢龙骨辊压设备选择指南 - 优质品牌商家
  • AI 术语通俗词典:Dropout 层
  • BGM自由!2026视频创作者必备的5个免费商用音乐素材库
  • Perplexity阅读推荐查询调优手册:从冷启动到高精度召回,6步达成92.7%相关性提升
  • 2026年专业聚合氯化铝厂家排行:阳离子聚丙烯酰胺/非离子聚丙烯酰胺/PAC聚合氯化铝/PAM絮凝剂/乙二胺四乙酸二钠EDTA2Na/选择指南 - 优质品牌商家
  • 揭秘TransNet V2:如何用AI智能检测视频镜头边界,提升剪辑效率300%
  • TCP协议深度解析:从核心原理到线上故障排查实战
  • 技术从业者的团队协作:如何打造高效的技术团队
  • Perplexity查词响应时间<120ms的秘密:拆解其混合检索架构中的3层缓存协同机制
  • 【Perplexity工程知识查询黄金标准】:基于127个真实故障案例构建的Query构造Checklist(含SOP模板)
  • 2026年诚信型校园兑换柜优质服务商推荐:学校兑换柜、学生积分兑换柜、安全积分兑换柜、德育兑换柜、德育积分兑换柜选择指南 - 优质品牌商家
  • 深入TIA Portal项目文件:手把手教你解析与修改PLC变量表XML(避坑指南)
  • 别再用笨方法了!用Python解线性方程组,这5个库哪个最快最准?(附性能对比)
  • 【紧急预警】DeepSeek-V2上线在即!你的8×A100集群正面临3大未声明资源缺口(含CUDA 12.4兼容性断点)
  • AI 术语通俗词典:归一化层
  • Linux内存文件系统移植:从ramfs到initramfs的嵌入式实战指南
  • YOLOv8模型魔改实战:用RT-DETR的AIFI模块替换SPPF,性能对比与效果实测
  • 2026年免费商用音乐素材网站TOP5深度评测:从版权合规到项目适配的全方位指南
  • c++动态链接库(dll)中添加空的控制台程序,调用dll进行测试
  • 告别调参噩梦:用nnU-Net自动搞定医学影像分割,新手也能快速上手
  • 2026年专业冷弯成型机TOP5排行:全自动冷弯型钢生产线、全自动辊压生产线、定制辊压成型模具、异型冷弯成型设备选择指南 - 优质品牌商家
  • TCGA数据库改版后,如何精准下载FFPE病理切片?手把手教你用gdc-client搞定
  • 保姆级教程:从零设计一个EG2133自举电路,手把手教你计算和选型自举电容与二极管
  • Perplexity作家搜索≠简单关键词匹配:从NLP意图识别到跨平台身份对齐的9层专业验证体系
  • 拒绝“拍脑袋“备货:武汉丝路云如何利用Flink实时计算打造跨境供应链的“数据大脑“?
  • 【Perplexity文学查询实战指南】:3大隐藏技巧让90%的文学研究效率提升300%
  • 定向井轨迹控制关键技术:200℃高温定向传感器的随钻测量应用指南