在使用组合模式中需要注意一点也是组合模式最关键的地方:叶子对象和组合对象实现相同的接口。这就是组合模式能够将叶子节点和对象节点进行一致处理的原因。
下面以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