目录
简介
角色组成
实现步骤
1. 新建 Document.class 抽象类,定义如下方法
2. 新建 Folder.class,添加如下代码
3. 新建 Music.class,添加如下代码
4. 测试一下,模拟往文件夹放入文件
组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构;组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole) 模式,它是一种对象结构型模式;组合模式主要用于处理树形结构的数据,组合模式通过一种巧妙的设计方案,可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点(包含子节点的节点)
1. Ducument:抽象构件,它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现;在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等
2. Folder:容器构件,它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法
3. Music:叶子构件,它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为;对于那些访问及管理子构件的方法,可以通过异常等方式进行处理
/*** 公共父类 - 文件类*/
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();}
}
注意:这里为什么我们要把这几个方法的实现抛出异常?因为后面的容器构件和叶子构件都要继承这个抽象类,对于叶子构件来说,它已经是最后一级,不应该具有这几个方法的实现,所以这里直接抛出异常!而容器构件则需要重写这几个方法,实现具体的逻辑
/*** 文件夹 - 容器构件*/
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());}
}
/*** 音乐文件 - 叶子节点*/
public class Music extends Document {// 文件名private String name;public Music(String name) {this.name = name;}@Overridepublic void print() {System.out.println(this.name);}
}
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();
}