模式動(dòng)機(jī)
組合模式描述了如何將容器對(duì)象和葉子對(duì)象進(jìn)行遞歸組合,使得用戶在使用時(shí)無需對(duì)他們進(jìn)行區(qū)分茫蛹,可以一致的對(duì)待容器對(duì)象和葉子對(duì)象营曼,這就是組合模式的模式動(dòng)機(jī)蛾派。
模式結(jié)構(gòu)
- Component: 抽象結(jié)構(gòu)
- leaf: 葉子結(jié)構(gòu)
- Composite: 容器結(jié)構(gòu)
- Client: 客戶端
組合模式實(shí)例與解析
實(shí)例:水果盤
在水果盤(Plate)中有一些水果,如蘋果(Apple)往毡、香蕉(Banana)蒙揣、梨子(Pear),當(dāng)然大水果盤中還可以有小水果盤开瞭,現(xiàn)需要對(duì)盤中的水果進(jìn)行遍歷(吃)懒震,當(dāng)然如果對(duì)一個(gè)水果盤執(zhí)行“吃”方法,實(shí)際上就是吃其中的水果惩阶。
抽象結(jié)構(gòu)
public abstract class MyElement {
public abstract void eat();
}
葉子結(jié)構(gòu)
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 !");
}
}
容器結(jié)構(gòu)
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();
}
}
模式試用環(huán)境
- 需要表示一個(gè)對(duì)象整體或部分層次挎狸,在具有整體和部分的層次結(jié)構(gòu)中,希望通過一種方式忽略整體與部分的差異断楷,可以一致地對(duì)待它們。
- 讓客戶能夠忽略不同對(duì)象層次的變化崭别,客戶端可以針對(duì)抽象構(gòu)件編程冬筒,無須關(guān)心對(duì)象層次結(jié)構(gòu)的細(xì)節(jié)。
- 對(duì)象的結(jié)構(gòu)是動(dòng)態(tài)的并且復(fù)雜程度不一樣逗旁,但客戶需要一致地處理它們错邦。