组合模式(Composite Pattern)

组合模式(Composite Pattern)

组合模式是一种结构型设计模式,它将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,客户端可以统一地处理单个对象和组合对象。

模式结构

  1. 组件接口(Component)
    定义组合模式中所有对象的公共接口,声明对象拥有的公共方法。
  2. 叶子节点(Leaf)
    实现组件接口,表示组合中的叶子节点,不包含任何子组件。
  3. 复合对象(Composite)
    实现组件接口,并包含一组子组件(可以是叶子节点或其他复合对象)。复合对象负责将操作委托给其子组件。

代码示例

1. 组件接口(Component)

// 组件接口:定义组合模式中所有对象的公共接口
interface Shape {
    void draw(String fillColor);
}

2. 叶子节点(Leaf)

// 叶子节点:三角形
class Triangle implements Shape {
    @Override
    public void draw(String fillColor) {
        System.out.println("Drawing Triangle with color : " + fillColor);
    }
}

// 叶子节点:圆形
class Circle implements Shape {
    @Override
    public void draw(String fillColor) {
        System.out.println("Drawing Circle with color : " + fillColor);
    }
}

3. 复合对象(Composite)

// 复合对象:绘画
class Drawing implements Shape {
    private final List<Shape> shapes = new ArrayList<>();

    @Override
    public void draw(String fillColor) {
        for (Shape shape : shapes) {
            shape.draw(fillColor);
        }
    }

    // 添加形状
    public void add(Shape shape) {
        shapes.add(shape);
    }

    // 移除形状
    public void remove(Shape shape) {
        shapes.remove(shape);
    }

    // 清空所有形状
    public void clear() {
        System.out.println("Clearing all the shapes from drawing");
        shapes.clear();
    }
}

4.调用示例

public class CompositePattern {
    public static void main(String[] args) {
        // 创建叶子节点
        Shape triangle = new Triangle();
        Shape circle = new Circle();

        // 创建复合对象
        Drawing drawing = new Drawing();
        drawing.add(triangle);
        drawing.add(circle);

        // 绘制所有形状
        drawing.draw("pink");

        // 清空并重新添加形状
        drawing.clear();
        drawing.add(triangle);
        drawing.draw("blue");
    }
}

输出结果

Drawing Triangle with color : pink
Drawing Circle with color : pink
Clearing all the shapes from drawing
Drawing Triangle with color : blue

应用场景

  1. 树状对象结构
    当需要实现树状对象结构时,可以使用组合模式。组合模式为使用者提供了两种共享公共接口的基本元素类型:叶节点和组合。
  2. 部分-整体层次结构
    当需求中体现部分与整体层次的结构时,或希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,可以考虑使用组合模式。

优缺点

优点

  1. 统一处理
    组合模式使得客户端可以统一地处理单个对象和组合对象,简化了客户端代码。
  2. 扩展性
    无需更改已有的代码,就可以在应用中添加新对象,使其成为树结构的一部分。
  3. 灵活性
    可以利用多态和递归的机制,更方便地使用复杂的树形结构。

缺点

  1. 接口设计困难
    对于功能差异较大的类,提供公共接口比较困难。
  2. 复杂性增加
    组合模式引入了额外的类和接口,增加了代码的复杂性。

总结

组合模式通过将对象组合成树形结构,使得客户端可以统一地处理单个对象和组合对象。它适用于需要实现树状对象结构或部分-整体层次结构的场景。尽管它可能会增加代码的复杂性,但其优点在于提高了代码的灵活性和可扩展性。组合模式在需要处理树形结构的场景中非常有用。