设计模式 - 组合模式(Composite Pattern)
介绍
组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示“整体-部分”的层次结构。组合模式使得用户可以一致地使用组合体和单个对象。
实现
我们以一个文件系统为例,来展示如何使用组合模式来模拟文件夹和文件的关系。
定义节点接口
首先定义一个节点接口,它代表文件系统中的任意元素(文件或文件夹)。
interface FileSystemNode {
void add(FileSystemNode node);
void remove(FileSystemNode node);
FileSystemNode getChild(int index);
void printList();
}
创建文件夹类
接着创建一个表示文件夹的类,它实现了 FileSystemNode
接口。
class Directory implements FileSystemNode {
private String name;
private List<FileSystemNode> children = new ArrayList<>();
public Directory(String name) {
this.name = name;
}
@Override
public void add(FileSystemNode node) {
children.add(node);
}
@Override
public void remove(FileSystemNode node) {
children.remove(node);
}
@Override
public FileSystemNode getChild(int index) {
return children.get(index);
}
@Override
public void printList() {
System.out.println(name);
for (FileSystemNode child : children) {
child.printList();
}
}
}
创建文件类
创建一个表示文件的类,它同样实现了 FileSystemNode
接口。
class File implements FileSystemNode {
private String name;
public File(String name) {
this.name = name;
}
@Override
public void add(FileSystemNode node) {
throw new UnsupportedOperationException("Cannot add to a file.");
}
@Override
public void remove(FileSystemNode node) {
throw new UnsupportedOperationException("Cannot remove from a file.");
}
@Override
public FileSystemNode getChild(int index) {
throw new UnsupportedOperationException("Cannot get child of a file.");
}
@Override
public void printList() {
System.out.println(name);
}
}
使用组合模式
接下来,在主程序中使用组合模式来构建文件系统的树形结构。
public class FileSystem {
public static void main(String[] args) {
// 创建根目录
FileSystemNode rootDirectory = new Directory("root");
// 创建子目录
FileSystemNode subDirectory = new Directory("subdirectory");
// 创建文件
FileSystemNode file1 = new File("document.txt");
FileSystemNode file2 = new File("presentation.pptx");
// 将文件添加到子目录
subDirectory.add(file1);
subDirectory.add(file2);
// 将子目录添加到根目录
rootDirectory.add(subDirectory);
// 打印文件系统的目录结构
rootDirectory.printList();
}
}
使用场景
组合模式适用于以下情况:
- 你想表示对象的部分-整体层次结构。
- 你需要一个树形结构来描述事物的层次关系。
- 你想在不改变客户端的情况下,使用一个统一的接口来表示不同的对象层次。
总结
组合模式通过定义一个公共接口来表示树形结构中的各个组成部分,使得单个对象和组合对象可以一致地被对待。这种方式可以简化客户端代码,并且允许在运行时构建复杂的层次结构。
以上就是组合模式的一个实现案例,希望这篇文章能帮助你理解组合模式的使用方式及其应用场景。
评论区