一. 定义

  • 组合多个对象形成树形结构以表示“部分整体”的结构层次(树形结构)。

  • 组合模式对叶子对象和容器对象的使用具有一致性。

  • 组合模式关注那些存在叶子构件和容器构件以及他们的组织形式,叶子构件不能包含成员对象,而容器构件可以包含成员对象,这些成员对象,可以是叶子也可以是容器,他们构成了一个树形结构。


二. 模式结构

uTools_1688396411083.png

uTools_1688396686897.png

1. Component(抽象构件)

  • 抽象构件可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。

2. Leaf(叶子构件)

  • 叶子构件在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。

3. Composite(容器构件)

  • 容器构件在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包含那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。


三. 实例

uTools_1688525488235.png

1. MyElment

public abstract class MyElement {
    public abstract void eat();
}

2. Apple/Plear

public class Apple extends MyElement{
    @Override
    public void eat() {
        System.out.println("吃苹果");
    }
}
public class Pear extends MyElement{
    @Override
    public void eat() {
        System.out.println("吃梨");
    }
}

3. Plate

import java.util.ArrayList;

public class Plate extends MyElement{
    private ArrayList list=new ArrayList();

    public void add(MyElement e) {
        list.add(e);
    }

    public void remove(MyElement e) {
        list.remove(e);
    }

    @Override
    public void eat() {
        for(Object e:list) {
            ((MyElement)e).eat();
        }
    }
}

4. Client

public class Client
{
    public static void main(String[] args) throws Exception
    {
        Plate p1, p2, p3;

        p3=new Plate();
        p3.add(new Apple());

        p2=new Plate();
        p2.add(new Pear());
        p2.add(p3);

        p1=new Plate();
        p1.add(new Apple());
        p1.add(p2);;

        p1.eat();
    }
}