My App

组合模式

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 的树形解析

On this page