模式动机
组合模式描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无需对他们进行区分,可以一致的对待容器对象和叶子对象,这就是组合模式的模式动机。
模式结构
- Component: 抽象结构
- leaf: 叶子结构
- Composite: 容器结构
- Client: 客户端
组合模式实例与解析
实例:水果盘
在水果盘(Plate)中有一些水果,如苹果(Apple)、香蕉(Banana)、梨子(Pear),当然大水果盘中还可以有小水果盘,现需要对盘中的水果进行遍历(吃),当然如果对一个水果盘执行“吃”方法,实际上就是吃其中的水果。
抽象结构
public abstract class MyElement {
public abstract void eat();
}
叶子结构
public class Apple extends MyElement{
public void eat(){
System.out.peintln("eat apple !");
}
}
public class Pear extends MyElement {
public void eat(){
System.out.println("eat pear !");
}
}
public class Banana extends MyElement{
public void eat(){
System.out.println("eat banana !");
}
}
容器结构
public class Plate extends MyElement{
private ArrayList list = new ArrayList();
public void add(MyElement element)
list.add(element);
}
public void delete(MyElement element{
list.delete(element);
}
public void eat(){
for(Object obj: list){
((MyElement)obj).eat();
}
}
}
客户端
pubic class Client{
public static void main(String[] args{
MyElement obj1, obj2, obj3, obj4, obj5;
Plate plate1, plate2, plate3;
obj1 = new Apple();
obj2 = new Pear();
plate1 = new Plate();
plate1.add(obj1);
plate2.add(obj2);
obj3 = new Banana();
obj4 = new Banana();
plate2 = new Plate();
plate2.add(obj3);
plate2.add(obj4);
obj5 = new Apple();
plate3 = new Plate();
plate3.add(plate1);
plate3.add(plate2);
plate3.add(obj5);
plate3.eat();
}
}
模式试用环境
- 需要表示一个对象整体或部分层次,在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,可以一致地对待它们。
- 让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无须关心对象层次结构的细节。
- 对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们。