组合模式(Composite Pattern),属于结构型模式,组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次。组合模式对单个对象(叶子对象)和组合对象(组合对象)具有一致性(统一的接口),在调用时可以忽略复杂的层次结构,使用统一的方式去操作层次结构中的所有对象。使程序能够与复杂元素的内部结构解耦。
下面是一个操作文件夹的demo:
文件结构:
文件接口:
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();
}
不同类型的文件:
public class ImageFile extends File {
public ImageFile(String name) {
super(name);
}
@Override
public void display() {
System.out.println(super.getName());
}
}
public class TextFile extends File {
public TextFile(String name) {
super(name);
}
@Override
public void display() {
System.out.println(super.getName());
}
}
实现了文件接口的文件夹:
public class Folder extends File {
private List<File> fileList;
public Folder(String name) {
super(name);
fileList = new ArrayList<>();
}
@Override
public void display() {
// 显示每一个文件
for (File file : fileList) {
file.display();
}
}
public void add(File file) {
fileList.add(file);
}
public void remove(File file) {
fileList.remove(file);
}
}
调用:
// 新建文件、文件夹
ImageFile image1 = new ImageFile("图片文件1");
ImageFile image2 = new ImageFile("图片文件2");
TextFile textFile = new TextFile("文本文件1");
Folder homeFolder = new Folder("主目录");
Folder imageFolder = new Folder("图片目录");
// 设置层次结构
imageFolder.add(image1);
imageFolder.add(image2);
homeFolder.add(textFile);
homeFolder.add(imageFolder);
// 文本文件的显示
textFile.display();
// 文件夹的显示
homeFolder.display();
输出结果:
文本文件1
文本文件1
图片文件1
图片文件2
优点 : 可以清楚地定义分层次的复杂对象,增加新部件也更容易。调用简单,组合结构和单个对象的调用方法一致。