一. 定义
组合多个对象形成树形结构以表示“部分整体”的结构层次(树形结构)。
组合模式对叶子对象和容器对象的使用具有一致性。
组合模式关注那些存在叶子构件和容器构件以及他们的组织形式,叶子构件不能包含成员对象,而容器构件可以包含成员对象,这些成员对象,可以是叶子也可以是容器,他们构成了一个树形结构。
二. 模式结构
1. Component(抽象构件)
抽象构件可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。
2. Leaf(叶子构件)
叶子构件在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。
3. Composite(容器构件)
容器构件在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包含那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。
三. 实例
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();
}
}