9.组合模式
创始人
2024-05-29 09:34:35
0

目录

简介

角色组成

实现步骤

1. 新建 Document.class 抽象类,定义如下方法

2. 新建 Folder.class,添加如下代码

3. 新建 Music.class,添加如下代码

4. 测试一下,模拟往文件夹放入文件


简介

组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构;组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole) 模式,它是一种对象结构型模式;组合模式主要用于处理树形结构的数据,组合模式通过一种巧妙的设计方案,可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点(包含子节点的节点)

角色组成

1. Ducument:抽象构件,它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现;在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等

2. Folder:容器构件,它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法

3. Music:叶子构件,它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为;对于那些访问及管理子构件的方法,可以通过异常等方式进行处理

实现步骤

1. 新建 Document.class 抽象类,定义如下方法

 

/*** 公共父类 - 文件类*/
public abstract class Document {/*** 添加文件*/public void add(Document document) {throw new UnsupportedOperationException();}/*** 删除文件*/public void remove(Document document) {throw new UnsupportedOperationException();}/*** 打印文件*/public void print() {throw new UnsupportedOperationException();}
}

注意:这里为什么我们要把这几个方法的实现抛出异常?因为后面的容器构件和叶子构件都要继承这个抽象类,对于叶子构件来说,它已经是最后一级,不应该具有这几个方法的实现,所以这里直接抛出异常!而容器构件则需要重写这几个方法,实现具体的逻辑

2. 新建 Folder.class,添加如下代码

/*** 文件夹 - 容器构件*/
public class Folder extends Document {// 文件名private String name;// 子级文件集合private List < Document > documents = new ArrayList <> ();public Folder(String name) {this.name = name;}@Overridepublic void add(Document document) {documents.add(document);}@Overridepublic void remove(Document document) {documents.remove(document);}@Overridepublic void print() {System.out.println("文件夹名:" + this.name);System.out.println("下级文件名:");documents.forEach(document - > document.print());}
}

3. 新建 Music.class,添加如下代码

/*** 音乐文件 - 叶子节点*/
public class Music extends Document {// 文件名private String name;public Music(String name) {this.name = name;}@Overridepublic void print() {System.out.println(this.name);}
}

4. 测试一下,模拟往文件夹放入文件

public static void main(String[] args) {Document musicFolder1 = new Folder("音乐文件夹1");Document music11 = new Music("忽然之间.mp3");Document music12 = new Music("这世界那么多人.mp3");Document music13 = new Music("外面的世界.mp3");musicFolder1.add(music11);musicFolder1.add(music12);musicFolder1.add(music13);musicFolder1.print();System.out.println("---------------------------");Document musicFolder2 = new Folder("音乐文件夹2");Document music21 = new Music("单车.mp3");Document music22 = new Music("红玫瑰.mp3");musicFolder2.add(music21);musicFolder2.add(music22);musicFolder2.print();
}

 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...