23种设计模式-结构型模式之组合模式(Java版本)

Java 组合模式(Composite Pattern)详解

什么是组合模式?

组合模式用于将对象组合成树形结构以表示“部分-整体”的层次结构,使客户端可以统一对待单个对象和组合对象


使用场景

  • 希望客户端忽略对象组合和单个对象的差别
  • 表示树形结构,如图形、文件系统、组织架构等

️ 模式结构

  • Component(抽象构件):定义所有对象的共同接口
  • Leaf(叶子节点):树的末端节点,无子节点
  • Composite(容器构件):有子节点,实现子节点管理逻辑

✅ 示例:文件系统结构

抽象组件(Component)

public abstract class FileComponent {
    protected String name;
    public FileComponent(String name) { this.name = name; }
    public abstract void display(String indent);
}

叶子节点(Leaf)

public class FileLeaf extends FileComponent {
    public FileLeaf(String name) {
        super(name);
    }

    @Override
    public void display(String indent) {
        System.out.println(indent + " " + name);
    }
}

组合节点(Composite)

import java.util.ArrayList;
import java.util.List;

public class FolderComposite extends FileComponent {
    private List children = new ArrayList<>();

    public FolderComposite(String name) {
        super(name);
    }

    public void add(FileComponent component) {
        children.add(component);
    }

    public void remove(FileComponent component) {
        children.remove(component);
    }

    @Override
    public void display(String indent) {
        System.out.println(indent + " " + name);
        for (FileComponent component : children) {
            component.display(indent + "    ");
        }
    }
}

客户端调用

public class Client {
    public static void main(String[] args) {
        FolderComposite root = new FolderComposite("Root");
        FolderComposite docs = new FolderComposite("Documents");
        FolderComposite pics = new FolderComposite("Pictures");

        FileLeaf file1 = new FileLeaf("Resume.pdf");
        FileLeaf file2 = new FileLeaf("CoverLetter.docx");
        FileLeaf img1 = new FileLeaf("Photo.jpg");

        docs.add(file1);
        docs.add(file2);
        pics.add(img1);

        root.add(docs);
        root.add(pics);

        root.display("");
    }
}

优点

  • 清晰地定义树形结构

  • 客户端可以一致性地处理单个对象和组合对象

  • 增加新类型节点方便

⚠️ 缺点

  • 抽象层与组合层差异被忽略,可能降低类型安全

  • 违反开闭原则:添加新功能可能需要修改组件接口

✅ 使用建议

当你需要表示一个树形结构,并希望客户端可以**透明地处理所有节点(不关心是组合还是叶子)**时,组合模式就是你的首选。

你可能感兴趣的:(23种设计模式,设计模式,组合模式,java,开发语言,jvm)