模式定义
组合模式(Composite Pattern):组合多个对象形成树形结构以表示“整体-部分”的结构层次。组合模式对单个对象和组合对象的使用具有一致性。属于对象结构模式,它将对象组织到树结构中,可以用来描述整体部分的关系。
模式结构
1.Component
抽象构件可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和方法。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。
2.Leaf
叶子构件在组合结构中表示叶子节点对象,叶子节点也没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式处理。
3.Composite
容器构件在组合结构中表示容器节点对象,容器节点对象也包含子节点,其子节点可以说叶子节点也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。
实例
在水果盘中有一些水果,如苹果、香蕉、梨子,大水果盘中还可以放小水果盘,现需要对盘中的水果进行遍历(吃),当然如果对一个水果盘执行“吃”的方法,实际上就是吃其中的水果。使用组合模式模拟该场景
类图如下:
public interface MyElement {
public void eat();
}
public class Apple implements MyElement {
public void eat() {
System.out.println("吃苹果!");
}
}
public class Banana implements MyElement {
public void eat() {
System.out.println("吃香蕉!");
}
}
public class Pear implements MyElement {
public void eat() {
System.out.println("吃梨子!");
}
}
public Plate implements MyElement {
private ArrayList list = new ArrayList();
public void add(MyElement e) {
list.add(e);
}
public void remove(MyElement e) {
list.remove(e);
}
public void eat() {
for (Object obj : list) {
((MyElement)obj).eat();
}
}
}