Java学设计模式之组合模式
一、组合模式概念
1.1 什么是组合模式
组合模式是一种结构型设计模式,它允许你将对象组合成树状结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,可以用统一的方式处理对象的访问。
结构
组合模式通常由以下几个部分组成:
- Component(组件): 定义了统一的接口,用于表示对象和对象集合的共同行为。
- Leaf(叶子节点): 表示树中的叶子节点对象,它实现了组件接口但没有子节点。
- Composite(组合节点): 表示树中的组合节点对象,它实现了组件接口并维护了一个子组件列表。
- Client(客户端): 使用组合模式的客户端代码。
二、组合模式代码
2.1 组件
public interface FileSystemItem {
void display();
}
2.2 叶子节点
public class File implements FileSystemItem {
private String name;
public File(String name) {
this.name = name;
}
@Override
public void display() {
System.out.println("File: " + name);
}
}
2.3 组合节点
public class Folder implements FileSystemItem {
private String name;
private List<FileSystemItem> children = new ArrayList<>();
public Folder(String name) {
this.name = name;
}
public void add(FileSystemItem item) {
children.add(item);
}
public void remove(FileSystemItem item) {
children.remove(item);
}
@Override
public void display() {
System.out.println("Folder: " + name);
for (FileSystemItem item : children) {
item.display();
}
}
}
2.4 测试类
public class CompositePatternTest {
public static void main(String[] args) {
// 创建文件和文件夹
FileSystemItem file1 = new File("file1.txt");
FileSystemItem file2 = new File("file2.txt");
Folder folder1 = new Folder("Folder 1");
folder1.add(file1);
Folder folder2 = new Folder("Folder 2");
folder2.add(file2);
Folder rootFolder = new Folder("Root");
rootFolder.add(folder1);
rootFolder.add(folder2);
// 显示文件系统结构
rootFolder.display();
// 输出:
// Folder: Root
// Folder: Folder 1
// File: file1.txt
// Folder: Folder 2
// File: file2.txt
}
}
三、总结
组合模式的优点包括:
- 简化客户端代码,客户端可以一致地对待单个对象和组合对象。
- 支持递归组合,可以构建任意复杂的层次结构。
缺点包括:
- 在某些情况下可能会限制组件的类型,因为组件必须实现统一的接口。
- 可能会增加设计的复杂性,特别是在处理递归结构时。