模式介绍

组合模式是一种结构型设计模式,它允许您将对象组合成树形结构来表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

使用场景

  • 当您想表示对象的部分-整体层次结构时
  • 当您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时
  • 当您需要处理树形结构时

代码示例

// 组件接口
public interface Component {
    void operation();
    void add(Component component);
    void remove(Component component);
    Component getChild(int index);
}

// 叶子节点
public class Leaf implements Component {
    private String name;

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

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

    @Override
    public void add(Component component) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void remove(Component component) {
        throw new UnsupportedOperationException();
    }

    @Override
    public Component getChild(int index) {
        throw new UnsupportedOperationException();
    }
}

// 组合节点
public class Composite implements Component {
    private List children = new ArrayList<>();

    @Override
    public void operation() {
        for (Component child : children) {
            child.operation();
        }
    }

    @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);
    }
}

优缺点

优点

  • 可以清楚地定义分层次的复杂对象
  • 简化了客户端代码
  • 更容易增加新类型的组件

缺点

  • 使设计变得更加抽象
  • 可能会使系统变得过于一般化
  • 不容易限制容器中的构件