設(shè)計模式07_組合模式_Composite

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盅抚,隨后出現(xiàn)的幾起案子漠魏,更是在濱河造成了極大的恐慌,老刑警劉巖妄均,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柱锹,死亡現(xiàn)場離奇詭異,居然都是意外死亡丰包,警方通過查閱死者的電腦和手機禁熏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邑彪,“玉大人瞧毙,你說我怎么就攤上這事〖闹ⅲ” “怎么了宙彪?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長有巧。 經(jīng)常有香客問我释漆,道長,這世上最難降的妖魔是什么篮迎? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任男图,我火速辦了婚禮,結(jié)果婚禮上柑潦,老公的妹妹穿的比我還像新娘享言。我一直安慰自己,他們只是感情好渗鬼,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布览露。 她就那樣靜靜地躺著,像睡著了一般譬胎。 火紅的嫁衣襯著肌膚如雪差牛。 梳的紋絲不亂的頭發(fā)上命锄,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音偏化,去河邊找鬼脐恩。 笑死,一個胖子當(dāng)著我的面吹牛侦讨,可吹牛的內(nèi)容都是我干的驶冒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼韵卤,長吁一口氣:“原來是場噩夢啊……” “哼骗污!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沈条,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤需忿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蜡歹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屋厘,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年月而,在試婚紗的時候發(fā)現(xiàn)自己被綠了汗洒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡父款,死狀恐怖仲翎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铛漓,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布鲫构,位于F島的核電站浓恶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏结笨。R本人自食惡果不足惜包晰,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炕吸。 院中可真熱鬧伐憾,春花似錦、人聲如沸赫模。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瀑罗。三九已至胸嘴,卻和暖如春雏掠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背劣像。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工乡话, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耳奕。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓绑青,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屋群。 傳聞我的和親對象是個殘疾皇子闸婴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容