1. 定義
先看看組合模式的定義吧:“將對象組合成樹形結(jié)構(gòu)以表示‘部分-整體’的層次結(jié)構(gòu)溪椎。組合模式使得用戶對單個對象和組合對象的使用具有一致性余佛。”
2. 結(jié)構(gòu)與角色
Component 抽象構(gòu)件角色
定義參加組合對象的共有方法和屬性,可以定義一些默認(rèn)的行為或?qū)傩浴?br> Leaf 葉子構(gòu)件
葉子對象,其下再也沒有其他的分支,也就是遍歷的最小單位渣聚。
Composite 樹枝構(gòu)件
樹枝對象,它的作用是組合樹枝節(jié)點和葉子節(jié)點形成一個樹形結(jié)構(gòu)僧叉。
3. 代碼示例
//抽象構(gòu)件
public abstract class Component {
//個體和整體都具有的共享
public void doSomething(){
//編寫業(yè)務(wù)邏輯
}
}
//樹枝構(gòu)件
public class Composite extends Component {
//構(gòu)件容器
private ArrayList<Component> componentArrayList = new ArrayList<Component>()
//增加一個葉子構(gòu)件或樹枝構(gòu)件
public void add(Component component){
this.componentArrayList.add(component);
}
//刪除一個葉子構(gòu)件或樹枝構(gòu)件
public void remove(Component component){
this.componentArrayList.remove(component);
}
//獲得分支下的所有葉子構(gòu)件和樹枝構(gòu)件
public ArrayList<Component> getChildren(){
return this.componentArrayList;
}
}
//樹葉構(gòu)件
public class Leaf extends Component {
/*
* 可以覆寫父類方法
* public void doSomething(){
*
* }
*/
}
//場景類
public class Client {
public static void main(String[] args) {
//創(chuàng)建一個根節(jié)點
Composite root = new Composite();
root.doSomething();
//創(chuàng)建一個樹枝構(gòu)件
Composite branch = new Composite();
//創(chuàng)建一個葉子節(jié)點
Leaf leaf = new Leaf();
//建立整體
root.add(branch);
branch.add(leaf); }
//通過遞歸遍歷樹
public static void display(Composite root){
for(Component c:root.getChildren()){
if(c instanceof Leaf){
//葉子節(jié)點 c.doSomething();
}else{
//樹枝節(jié)點
display((Composite)c);
}
}
}
}
4. 應(yīng)用
優(yōu)點
a.高層模塊調(diào)用簡單
一棵樹形機構(gòu)中的所有節(jié)點都是Component,局部和整體對調(diào)用者來說沒有任何區(qū)別棺榔, 也就是說瓶堕,高層模塊不必關(guān)心自己處理的是單個對象還是整個組合結(jié)構(gòu),簡化了高層模塊的 代碼症歇。
b.節(jié)點自由增加
使用了組合模式后郎笆,我們可以看看,如果想增加一個樹枝節(jié)點忘晤、樹葉節(jié)點是不是都很容 易宛蚓,只要找到它的父節(jié)點就成,非常容易擴展设塔,符合開閉原則凄吏,對以后的維護非常有利。
缺點
組合模式有一個非常明顯的缺點闰蛔,看到我們在場景類中的定義痕钢,提到樹葉和樹枝使用時 的定義了嗎?直接使用了實現(xiàn)類序六!這在面向接口編程上是很不恰當(dāng)?shù)娜瘟c依賴倒置原則沖 突,讀者在使用的時候要考慮清楚例诀,它限制了你接口的影響范圍随抠。
使用場景
維護和展示部分-整體關(guān)系的場景裁着,如樹形菜單、文件和文件夾管理拱她。
從一個整體中能夠獨立出部分模塊或功能的場景二驰。
注意事項
只要是樹形結(jié)構(gòu),就要考慮使用組合模式椭懊,這個一定要記住诸蚕,只要是要體現(xiàn)局部和整體的關(guān)系的時候,而且這種關(guān)系還可能比較深氧猬,考慮一下組合模式吧背犯。
轉(zhuǎn)載自
作者:博麟K
鏈接:http://www.reibang.com/p/1862ce4cf44d