在使用组合模式中需要注意一点也是组合模式最关键的地方:叶子对象和组合对象实现相同的接口。这就是组合模式能够将叶子节点和对象节点进行一致处理的原因。
下面以File为例,文件夹里有文件和子文件夹,不管是文件还是文件夹,他们都继承了相同的接口FIle
类图
1.创建FIle抽象类
package com.design.demo.composite; /** * @author: GuanBin * @date: Created in 下午10:26 2019/8/18 */ public abstract class File { String name; public File(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void display(); }
2.创建Folder继承File
package com.design.demo.composite; import java.util.ArrayList; import java.util.List; /** * @author: GuanBin * @date: Created in 下午10:30 2019/8/18 */ public class Folder extends File { private List<File> files; public Folder(String name) { super(name); this.files = new ArrayList<>(); } /** * 浏览文件夹中的文件信息 */ @Override public void display() { for (File file : files) { file.display(); } } /** * 向文件夹中添加文件 * * @param file */ public void add(File file) { files.add(file); } /** * 从文件夹中删除文件 * * @param file */ public void remove(File file) { files.remove(file); } }
3.创建ImageFile继承File
package com.design.demo.composite; /** * @author: GuanBin * @date: Created in 下午10:50 2019/8/18 */ public class ImageFile extends File { public ImageFile(String name) { super(name); } @Override public void display() { System.out.println("这是图像文件,文件名:"+super.name); } }
4.创建TextFile继承FIle
package com.design.demo.composite; /** * @author: GuanBin * @date: Created in 下午10:50 2019/8/18 */ public class TextFile extends File { public TextFile(String name) { super(name); } @Override public void display() { System.out.println("这是文本文件,文件名:"+super.name); } }
5.创建VideoFile继承File
package com.design.demo.composite; /** * @author: GuanBin * @date: Created in 下午10:50 2019/8/18 */ public class VideoFile extends File { public VideoFile(String name) { super(name); } @Override public void display() { System.out.println("这是影像文件,文件名:"+super.name); } }
6.创建Client
package com.design.demo.composite; /** * @author: GuanBin * @date: Created in 下午10:53 2019/8/18 */ public class Client { public static void main(String[] args) { Folder folder = new Folder("总文件夹"); folder.add(new TextFile("text.txt")); folder.add(new ImageFile("image.jpg")); Folder testFolder = new Folder("test文件夹"); testFolder.add(new TextFile("test1.txt")); testFolder.add(new ImageFile("test2.jpg")); testFolder.add(new VideoFile("test3.rmvb")); //把test文件夹添加到总文件夹下 folder.add(testFolder); //遍历 folder.display(); System.out.println("*****************************"); //添加 TextFile addFile = new TextFile("add.txt"); testFolder.add(addFile); folder.display(); System.out.println("*****************************"); //删除testFolder folder.remove(testFolder); folder.display(); } }
输出
这是文本文件,文件名:text.txt 这是图像文件,文件名:image.jpg 这是文本文件,文件名:test1.txt 这是图像文件,文件名:test2.jpg 这是影像文件,文件名:test3.rmvb ***************************** 这是文本文件,文件名:text.txt 这是图像文件,文件名:image.jpg 这是文本文件,文件名:test1.txt 这是图像文件,文件名:test2.jpg 这是影像文件,文件名:test3.rmvb 这是文本文件,文件名:add.txt ***************************** 这是文本文件,文件名:text.txt 这是图像文件,文件名:image.jpg Process finished with exit code 0