组合模式
组合模式(Composite Pattern)允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式让客户端可以统一地处理单个对象和组合对象。在这个模式中,组合对象(Composite)和叶子对象(Leaf)会实现相同的接口。
下面是一个使用组合模式的简单案例,我们将构建一个文件系统的表示,其中可以包含文件夹(组合对象)和文件(叶子对象)。
首先,定义一个公共接口 IFileSystemEntry,该接口将由文件夹和文件实现:
java
interface IFileSystemEntry {
void list();
}
然后,定义叶子对象 File,它实现了 IFileSystemEntry 接口:
java
class File implements IFileSystemEntry {
private String name;
public File(String name) {
this.name = name;
}
@Override
public void list() {
System.out.println("File: " + name);
}
}
接着,定义组合对象 Folder,它也实现了 IFileSystemEntry 接口,并且可以包含多个 IFileSystemEntry 对象(即文件夹或文件):
java
import java.util.ArrayList;
import java.util.List;
class Folder implements IFileSystemEntry {
private String name;
private List<IFileSystemEntry> children = new ArrayList<>();
public Folder(String name) {
this.name = name;
}
public void add(IFileSystemEntry entry) {
children.add(entry);
}
@Override
public void list() {
System.out.println("Folder: " + name);
for (IFileSystemEntry entry : children) {
entry.list();
}
}
}
最后,我们可以构建一个包含文件夹和文件的文件系统,并演示如何使用 list() 方法来列出所有文件和文件夹:
java
public class CompositePatternDemo {
public static void main(String[] args) {
// 创建文件夹和文件
Folder root = new Folder("root");
Folder folder1 = new Folder("folder1");
Folder folder2 = new Folder("folder2");
File file1 = new File("file1.txt");
File file2 = new File("file2.txt");
// 组织结构
root.add(folder1);
root.add(folder2);
folder1.add(file1);
folder2.add(file2);
// 打印文件系统
root.list();
}
}
输出结果:
Folder: root
Folder: folder1
File: file1.txt
Folder: folder2
File: file2.txt
这个示例展示了组合模式的基本应用,即如何通过递归调用 list() 方法来统一处理文件和文件夹的列表展示。