1. 概述 组合模式是一种用于处理树形结构的设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
  2. 主要角色 Component(组件):定义了树中每个节点的行为,既可以是叶子节点,也可以是组合节点。 Leaf(叶子节点):表示树中的叶节点,没有子节点。 Composite(组合节点):表示树中的分支节点,可以有多个子节点,通常包含一个集合来管理这些子节点。 Client(客户端):通过统一的接口与组合结构中的对象进行交互。
  3. 实现步骤 定义一个抽象的 Component 类或接口,声明所有子类共有的方法。 实现 Leaf 类,继承自 Component,实现具体的功能。 实现 Composite 类,继承自 Component,管理子节点的添加、删除和遍历操作。 客户端通过 Component 接口与组合结构中的对象进行交互。
  4. 示例代码 4.1 定义组件接口
public interface Component {
    void add(Component component);
    void remove(Component component);
    Component getChild(int index);
    void operation();
}

4.2 实现叶子节点

public class Leaf implements Component {
    private String name;

    public Leaf(String name) {
        this.name = name;
    }

    @Override
    public void add(Component component) {
        throw new UnsupportedOperationException("Leaf does not support add operation");
    }

    @Override
    public void remove(Component component) {
        throw new UnsupportedOperationException("Leaf does not support remove operation");
    }

    @Override
    public Component getChild(int index) {
        throw new UnsupportedOperationException("Leaf does not support getChild operation");
    }

    @Override
    public void operation() {
        System.out.println("Leaf " + name + " operation");
    }
}

4.3 实现组合节点

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

public class Composite implements Component {
    private String name;
    private List<Component> children = new ArrayList<>();

    public Composite(String name) {
        this.name = name;
    }

    @Override
    public void add(Component component) {
        children.add(component);
    }

    @Override
    public void remove(Component component) {
        children.remove(component);
    }

    @Override
    public Component getChild(int index) {
        return children.get(index);
    }

    @Override
    public void operation() {
        System.out.println("Composite " + name + " operation");
        for (Component child : children) {
            child.operation();
        }
    }
}

4.4 客户端代码

public class Client {
    public static void main(String[] args) {
        // 创建组合节点
        Composite root = new Composite("root");
        Composite branch1 = new Composite("branch1");
        Composite branch2 = new Composite("branch2");

        // 创建叶子节点
        Leaf leaf1 = new Leaf("leaf1");
        Leaf leaf2 = new Leaf("leaf2");
        Leaf leaf3 = new Leaf("leaf3");

        // 构建树形结构
        root.add(branch1);
        root.add(branch2);
        branch1.add(leaf1);
        branch1.add(leaf2);
        branch2.add(leaf3);

        // 执行操作
        root.operation();
    }
}
  1. 运行结果
Composite root operation
Composite branch1 operation
Leaf leaf1 operation
Leaf leaf2 operation
Composite branch2 operation
Leaf leaf3 operation
  1. 总结 组合模式通过将对象组织成树形结构,使得客户端可以一致地处理单个对象和组合对象。这种模式在处理具有层次结构的数据时非常有用,如文件系统、图形界面组件等。通过组合模式,可以简化客户端代码,提高系统的灵活性和可扩展性。