组合模式
Composite — 将对象组织成树形结构,统一对待单个对象和组合对象
一句话理解
让单个对象和对象的组合实现相同的接口,客户端可以一视同仁地操作它们。
解决什么问题
文件系统中,文件和文件夹是不同的东西,但你希望对它们执行相同的操作(获取大小、删除、显示名称)。组合模式让"叶子节点"和"容器节点"共用一套接口。
怎么写
// 统一接口
public interface FileComponent {
void display(String indent);
long getSize();
}
// 叶子节点:文件
public class File implements FileComponent {
private final String name;
private final long size;
public File(String name, long size) {
this.name = name;
this.size = size;
}
public void display(String indent) {
System.out.println(indent + "📄 " + name + " (" + size + "KB)");
}
public long getSize() { return size; }
}
// 容器节点:文件夹(可以包含文件和子文件夹)
public class Folder implements FileComponent {
private final String name;
private final List<FileComponent> children = new ArrayList<>();
public Folder(String name) { this.name = name; }
public void add(FileComponent component) { children.add(component); }
public void display(String indent) {
System.out.println(indent + "📁 " + name);
for (FileComponent child : children) {
child.display(indent + " ");
}
}
public long getSize() {
return children.stream().mapToLong(FileComponent::getSize).sum();
}
}Folder root = new Folder("项目");
root.add(new File("README.md", 5));
Folder src = new Folder("src");
src.add(new File("Main.java", 10));
src.add(new File("Utils.java", 8));
root.add(src);
root.display("");
// 📁 项目
// 📄 README.md (5KB)
// 📁 src
// 📄 Main.java (10KB)
// 📄 Utils.java (8KB)
System.out.println("总大小: " + root.getSize() + "KB"); // 23KB使用场景
- 文件系统(文件/文件夹)
- UI 组件树(React 组件树、Swing 容器)
- 组织架构(部门/员工)
- 菜单系统(菜单/菜单项)
- XML/JSON 的树形解析