组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,从而使得用户无需关心对象的具体类型,而只需要关心对象的接口。
下面是一个简单的组合模式的示例:
首先,我们定义一个抽象类 Component,它有一个 add() 方法和一个 remove() 方法,用于添加和删除子组件,还有一个 display() 方法,用于显示组件的信息:
public abstract class Component {
    protected String name;
    public Component(String name) {
        this.name = name;
    }
    public abstract void add(Component component);
    public abstract void remove(Component component);
    public abstract void display();
}然后,我们定义一个叶子节点类 Leaf,它继承自 Component,表示组合中的叶子节点:
public class Leaf extends Component {
    public Leaf(String name) {
        super(name);
    }
    public void add(Component component) {
        System.out.println("Cannot add to a leaf");
    }
    public void remove(Component component) {
        System.out.println("Cannot remove from a leaf");
    }
    public void display() {
        System.out.println(name);
    }
}接下来,我们定义一个组合节点类 Composite,它继承自 Component,表示组合中的非叶子节点:
import java.util.ArrayList;
import java.util.List;
public class Composite extends Component {
    private List<Component> children = new ArrayList<Component>();
    public Composite(String name) {
        super(name);
    }
    public void add(Component component) {
        children.add(component);
    }
    public void remove(Component component) {
        children.remove(component);
    }
    public void display() {
        System.out.println(name);
        for (Component component : children) {
            component.display();
        }
    }
}最后,我们可以使用组合模式来创建一个树形结构:
public class CompositePatternDemo {
    public static void main(String[] args) {
        Component root = new Composite("root");
        root.add(new Leaf("Leaf A"));
        root.add(new Leaf("Leaf B"));
        Component comp = new Composite("Composite X");
        comp.add(new Leaf("Leaf XA"));
        comp.add(new Leaf("Leaf XB"));
        root.add(comp);
        Component comp2 = new Composite("Composite Y");
        comp2.add(new Leaf("Leaf YA"));
        comp2.add(new Leaf("Leaf YB"));
        comp.add(comp2);
        root.display();
    }
}输出结果:
root
Leaf A
Leaf B
Composite X
Leaf XA
Leaf XB
Composite Y
Leaf YA
Leaf YB