Skip to content

组合模式

字数: 0 字 时长: 0 分钟

简介

组合模式(Composite Pattern)的核心是:将对象组合成树形结构,使得用户对单个对象和组合对象的使用具有一致性,它通过递归组合实现树状结构的统一操作。

比如一个文件夹里既可以放文件夹也可以放文件,组合模式使得用户对文件和文件夹的使用具有一致性,不需要判断是文件还是文件夹。

UML 类图

composite.webp

  • 抽象组件(Component):定义了所有组件必须遵循的接口
  • 叶子节点(Leaf):代表最基本的、不能再分的对象,不会再包含子节点
  • 容器节点(Composite):代表可以包含子节点的对象

实现示例

java
// 1. 定义抽象组件
interface FileComponent {
    // 定义展示目录结构的方法
    void display(String ident);
}

// 2. 实现叶子节点类
class FileLeaf implements FileComponent {
    private String name;
    public FileLeaf(String name) {
        this.name = name;
    }
    @Override
    public void display(String ident) {
        // 叶子节点只能为文件,负责输出字节的名字即可
        System.out.println(ident + "-文件:" + name);
    }
}

// 3. 实现组合节点类
class FolderComposite implements FileComponent { 
    private String name;
    private List<FileComponent> children = new ArrayList<>();
    public FolderComposite(String name) {
        this.name = name;
    }
    public void add(FileComponent component) {
        children.add(component);
    }
    public void remove(FileComponent component) {
        children.remove(component);
    }
    @Override
    public void display(String ident) { 
        System.out.println(ident + "-文件夹:" + name);
        for (FileComponent component : children) {
            component.display(ident + "  ");
        }
    }
}

// 4. 调用示例:构建并展示一个文件树结构
public static void main(String[] args) {
    // 创建文件
    FileLeaf file1 = new FileLeaf("readme.txt");
    FileLeaf file2 = new FileLeaf("file2.txt");
    FileLeaf file3 = new FileLeaf("file3.txt");
    // 创建文件夹
    FileComposite root = new FileComposite("根目录");
    FileComposite docs = new FileComposite("文档");
    // 构建层级关系
    root.add(docs);
    root.add(file1);
    docs.add(file2);
    docs.add(file3);
    // 显示结构 
    root.display("");
}