設(shè)計模式-組合模式

介紹

這篇主要講述設(shè)計模式中的組合模式貌矿。組合模式又叫部分整體模式雷蹂,是用于把一組相似的對象當(dāng)作一個單一的對象姆怪。組合模式依據(jù)樹形結(jié)構(gòu)來組合對象,用來表示部分以及整體層次宫屠。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式列疗,它創(chuàng)建了對象組的樹形結(jié)構(gòu)。
樹形結(jié)構(gòu)在軟件中隨處可見浪蹂,例如操作系統(tǒng)中的目錄結(jié)構(gòu)抵栈、應(yīng)用軟件中的菜單告材、辦公系統(tǒng)中的公司組織結(jié)構(gòu)等等。
接下來看看組合模式的結(jié)構(gòu)圖

結(jié)構(gòu)圖

這里寫圖片描述

在組合模式結(jié)構(gòu)圖中包含如下幾個角色:

  • Component(抽象構(gòu)件):它可以是接口或抽象類竭讳,為葉子構(gòu)件和容器構(gòu)件對象聲明接口创葡,在該角色中可以包含所有子類共有行為的聲明和實(shí)現(xiàn)。在抽象構(gòu)件中定義了訪問及管理它的子構(gòu)件的方法绢慢,如增加子構(gòu)件灿渴、刪除子構(gòu)件、獲取子構(gòu)件等胰舆。
  • Leaf(葉子構(gòu)件):它在組合結(jié)構(gòu)中表示葉子節(jié)點(diǎn)對象骚露,葉子節(jié)點(diǎn)沒有子節(jié)點(diǎn),它實(shí)現(xiàn)了在抽象構(gòu)件中定義的行為缚窿。對于那些訪問及管理子構(gòu)件的方法棘幸,可以通過異常等方式進(jìn)行處理。
  • Composite(容器構(gòu)件):它在組合結(jié)構(gòu)中表示容器節(jié)點(diǎn)對象倦零,容器節(jié)點(diǎn)包含子節(jié)點(diǎn)误续,其子節(jié)點(diǎn)可以是葉子節(jié)點(diǎn),也可以是容器節(jié)點(diǎn)扫茅,它提供一個集合用于存儲子節(jié)點(diǎn)蹋嵌,實(shí)現(xiàn)了在抽象構(gòu)件中定義的行為,包括那些訪問及管理子構(gòu)件的方法葫隙,在其業(yè)務(wù)方法中可以遞歸調(diào)用其子節(jié)點(diǎn)的業(yè)務(wù)方法栽烂。

案例

Component (抽象構(gòu)件)

public abstract class Component {
    public abstract void add(Component component);
    public abstract void remove(Component component);
}

Leaf (葉子構(gòu)件)

public class Leaf extends Component {

    @Override
    public void add(Component component) {
        // TODO Auto-generated method stub

    }

    @Override
    public void remove(Component component) {
        // TODO Auto-generated method stub

    }

}

Composite (容器構(gòu)件)

public class Composite extends Component {
    private List<Component> children = new ArrayList<Component>();

    @Override
    public void add(Component component) {
        children.add(component);
    }

    @Override
    public void remove(Component component) {
        children.remove(component);
    }

}

總結(jié)

組合模式的關(guān)鍵是定義了一個抽象構(gòu)件類,它既可以代表葉子恋脚,又可以代表容器腺办,而客戶端針對該抽象構(gòu)件類進(jìn)行編程,無須知道它到底表示的是葉子還是容器糟描,可以對其進(jìn)行統(tǒng)一處理怀喉。同時容器對象與抽象構(gòu)件類之間還建立一個聚合關(guān)聯(lián)關(guān)系,在容器對象中既可以包含葉子船响,也可以包含容器磺送,以此實(shí)現(xiàn)遞歸組合,形成一個樹形結(jié)構(gòu)灿意。
如果不使用組合模式,客戶端代碼將過多地依賴于容器對象復(fù)雜的內(nèi)部實(shí)現(xiàn)結(jié)構(gòu)崇呵,容器對象內(nèi)部實(shí)現(xiàn)結(jié)構(gòu)的變化將引起客戶代碼的頻繁變化缤剧,帶來了代碼維護(hù)復(fù)雜、可擴(kuò)展性差等弊端域慷。組合模式的引入將在一定程度上解決這些問題荒辕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汗销,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抵窒,更是在濱河造成了極大的恐慌弛针,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件李皇,死亡現(xiàn)場離奇詭異削茁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掉房,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門茧跋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卓囚,你說我怎么就攤上這事瘾杭。” “怎么了哪亿?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵粥烁,是天一觀的道長。 經(jīng)常有香客問我蝇棉,道長讨阻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任银萍,我火速辦了婚禮变勇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贴唇。我一直安慰自己搀绣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布戳气。 她就那樣靜靜地躺著链患,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓶您。 梳的紋絲不亂的頭發(fā)上麻捻,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音呀袱,去河邊找鬼贸毕。 笑死,一個胖子當(dāng)著我的面吹牛夜赵,可吹牛的內(nèi)容都是我干的明棍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寇僧,長吁一口氣:“原來是場噩夢啊……” “哼摊腋!你這毒婦竟也來了沸版?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤兴蒸,失蹤者是張志新(化名)和其女友劉穎视粮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橙凳,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕾殴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了痕惋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片区宇。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖值戳,靈堂內(nèi)的尸體忽然破棺而出议谷,到底是詐尸還是另有隱情,我是刑警寧澤堕虹,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布卧晓,位于F島的核電站,受9級特大地震影響赴捞,放射性物質(zhì)發(fā)生泄漏逼裆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一赦政、第九天 我趴在偏房一處隱蔽的房頂上張望胜宇。 院中可真熱鬧,春花似錦恢着、人聲如沸桐愉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽从诲。三九已至,卻和暖如春靡羡,著一層夾襖步出監(jiān)牢的瞬間系洛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工略步, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留描扯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓趟薄,卻偏偏與公主長得像绽诚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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

  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是組合模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 一憔购、...
    w1992wishes閱讀 890評論 0 2
  • 繼承是is-a的關(guān)系。組合和聚合有點(diǎn)像岔帽,有些書上沒有作區(qū)分玫鸟,都稱之為has-a,有些書上對其進(jìn)行了較為嚴(yán)格區(qū)分犀勒,組...
    時待吾閱讀 460評論 0 1
  • 1.組合模式的定義及使用場景組合模式也稱為部分整體模式屎飘,結(jié)構(gòu)型設(shè)計模式之一,組合模式比較簡單贾费,它將一組相似的對象看...
    GB_speak閱讀 863評論 0 2
  • 設(shè)計模式匯總 一钦购、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,947評論 1 15
  • View 和 ViewGroup 的 關(guān)系 在我們前面對 事件的分發(fā) 和 View 的分發(fā)中我們可以知道這兩者是密...
    銳_nmpoi閱讀 1,990評論 0 0