組合模式

參考
設(shè)計(jì)模式讀書(shū)筆記-----組合模式
C++設(shè)計(jì)模式——組合模式
Javascript設(shè)計(jì)模式理論與實(shí)戰(zhàn):組合模式

我們平時(shí)開(kāi)發(fā)過(guò)程中,一定會(huì)遇到這種情況:同時(shí)處理簡(jiǎn)單對(duì)象和由簡(jiǎn)單對(duì)象組成的復(fù)雜對(duì)象,這些簡(jiǎn)單對(duì)象和復(fù)雜對(duì)象會(huì)組合成樹(shù)形結(jié)構(gòu),在客戶端對(duì)其處理的時(shí)候要保持一致性。比如電商網(wǎng)站中的產(chǎn)品訂單梦鉴,每一張產(chǎn)品訂單可能有多個(gè)子訂單組合闺鲸,比如操作系統(tǒng)的文件夾,每個(gè)文件夾有多個(gè)子文件夾或文件维雇,我們作為用戶對(duì)其進(jìn)行復(fù)制,刪除等操作時(shí)晒他,不管是文件夾還是文件吱型,對(duì)我們操作者來(lái)說(shuō)是一樣的。在這種場(chǎng)景下陨仅,就非常適合使用組合模式來(lái)實(shí)現(xiàn)津滞。

一、基本知識(shí)

組合模式:將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)灼伤,組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性触徐。
組合模式主要有三個(gè)角色:
(1)抽象組件(Component):抽象類,主要定義了參與組合的對(duì)象的公共接口
(2)子對(duì)象(Leaf):組成組合對(duì)象的最基本對(duì)象
(3)組合對(duì)象(Composite):由子對(duì)象組合起來(lái)的復(fù)雜對(duì)象
理解組合模式的關(guān)鍵是要理解組合模式對(duì)單個(gè)對(duì)象和組合對(duì)象使用的一致性狐赡,我們接下來(lái)說(shuō)說(shuō)組合模式的實(shí)現(xiàn)加深理解撞鹉。

二、文件夾和文件的例子
Paste_Image.png
//文件類:File.java
public abstract class File {
    String name;
    
    public File(String name){
        this.name = name;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void display();
}

//文件夾類:Folder.java,該類包含對(duì)文件的增加鸟雏、刪除和瀏覽三個(gè)方法
public class Folder extends File{
    private List<File> files;
    
    public Folder(String name){
        super(name);
        files = new ArrayList<File>();
    }
    
    /**
     * 瀏覽文件夾中的文件
     */
    public void display() {
        for(File file : files){
            file.display();
        }
    }
    
    /**
     * @desc 向文件夾中添加文件
     * @param file
     * @return void
     */
    public void add(File file){
        files.add(file);
    }
    
    /**
     * @desc 從文件夾中刪除文件
     * @param file
     * @return void
     */
    public void remove(File file){
        files.remove(file);
    }
}

//然后是三個(gè)文件類:TextFile.java享郊、ImageFile.java、VideoFile.java
public class TextFile extends File{

    public TextFile(String name) {
        super(name);
    }

    public void display() {
        System.out.println("這是文本文件孝鹊,文件名:" + super.getName());
    }
    
}

public class ImagerFile extends File{

    public ImagerFile(String name) {
        super(name);
    }

    public void display() {
        System.out.println("這是圖像文件炊琉,文件名:" + super.getName());
    }

}

public class VideoFile extends File{

    public VideoFile(String name) {
        super(name);
    }

    public void display() {
        System.out.println("這是影像文件,文件名:" + super.getName());
    }

}

//最后是客戶端
public class Client {
    public static void main(String[] args) {
        /**
         * 我們先建立一個(gè)這樣的文件系統(tǒng)
         *                  總文件
         *                  
         *   a.txt    b.jpg                   c文件夾              
         *                      c_1.text  c_1.rmvb    c_1.jpg   
         *                                                       
         */ 
        //總文件夾
        Folder zwjj = new Folder("總文件夾");
        //向總文件夾中放入三個(gè)文件:1.txt又活、2.jpg苔咪、1文件夾
        TextFile aText= new TextFile("a.txt");
        ImagerFile bImager = new ImagerFile("b.jpg");
        Folder cFolder = new Folder("C文件夾");
        
        zwjj.add(aText);
        zwjj.add(bImager);
        zwjj.add(cFolder);
        
        //向C文件夾中添加文件:c_1.txt、c_1.rmvb柳骄、c_1.jpg 
        TextFile cText = new TextFile("c_1.txt");
        ImagerFile cImage = new ImagerFile("c_1.jpg");
        VideoFile cVideo = new VideoFile("c_1.rmvb");
        
        cFolder.add(cText);
        cFolder.add(cImage);
        cFolder.add(cVideo);
        
        //遍歷C文件夾
        cFolder.display();
        //將c_1.txt刪除
        cFolder.remove(cText);
        System.out.println("-----------------------");
        cFolder.display();
    }
}

優(yōu)點(diǎn)
1悼泌、可以清楚地定義分層次的復(fù)雜對(duì)象,表示對(duì)象的全部或部分層次夹界,使得增加新構(gòu)件也更容易馆里。
2、客戶端調(diào)用簡(jiǎn)單可柿,客戶端可以一致的使用組合結(jié)構(gòu)或其中單個(gè)對(duì)象鸠踪。
3、定義了包含葉子對(duì)象和容器對(duì)象的類層次結(jié)構(gòu)复斥,葉子對(duì)象可以被組合成更復(fù)雜的容器對(duì)象营密,而這個(gè)容器對(duì)象又可以被組合,這樣不斷遞歸下去目锭,可以形成復(fù)雜的樹(shù)形結(jié)構(gòu)评汰。
4、更容易在組合體內(nèi)加入對(duì)象構(gòu)件痢虹,客戶端不必因?yàn)榧尤肓诵碌膶?duì)象構(gòu)件而更改原有代碼被去。

缺點(diǎn)
1、使設(shè)計(jì)變得更加抽象奖唯,對(duì)象的業(yè)務(wù)規(guī)則如果很復(fù)雜惨缆,則實(shí)現(xiàn)組合模式具有很大挑戰(zhàn)性,而且不是所有的方法都與葉子對(duì)象子類都有關(guān)聯(lián)

**模式適用場(chǎng)景 **
1丰捷、需要表示一個(gè)對(duì)象整體或部分層次坯墨,在具有整體和部分的層次結(jié)構(gòu)中,希望通過(guò)一種方式忽略整體與部分的差異病往,可以一致地對(duì)待它們捣染。
2、讓客戶能夠忽略不同對(duì)象層次的變化停巷,客戶端可以針對(duì)抽象構(gòu)件編程耍攘,無(wú)須關(guān)心對(duì)象層次結(jié)構(gòu)的細(xì)節(jié)榕栏。

模式總結(jié)
1、 組合模式用于將多個(gè)對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“整體-部分”的結(jié)構(gòu)層次少漆。組合模式對(duì)單個(gè)對(duì)象(葉子對(duì)象)和組合對(duì)象(容器對(duì)象)的使用具有一致性臼膏。
2、 組合對(duì)象的關(guān)鍵在于它定義了一個(gè)抽象構(gòu)建類示损,它既可表示葉子對(duì)象渗磅,也可表示容器對(duì)象,客戶僅僅需要針對(duì)這個(gè)抽象構(gòu)建進(jìn)行編程检访,無(wú)須知道他是葉子對(duì)象還是容器對(duì)象始鱼,都是一致對(duì)待。
3脆贵、 組合模式雖然能夠非常好地處理層次結(jié)構(gòu)医清,也使得客戶端程序變得簡(jiǎn)單,但是它也使得設(shè)計(jì)變得更加抽象卖氨,而且也很難對(duì)容器中的構(gòu)件類型進(jìn)行限制会烙,這會(huì)導(dǎo)致在增加新的構(gòu)件時(shí)會(huì)產(chǎn)生一些問(wèn)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筒捺,一起剝皮案震驚了整個(gè)濱河市柏腻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌系吭,老刑警劉巖五嫂,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肯尺,居然都是意外死亡沃缘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)则吟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)槐臀,“玉大人,你說(shuō)我怎么就攤上這事逾滥》宓担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵寨昙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我掀亩,道長(zhǎng)舔哪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任槽棍,我火速辦了婚禮捉蚤,結(jié)果婚禮上抬驴,老公的妹妹穿的比我還像新娘。我一直安慰自己缆巧,他們只是感情好布持,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著陕悬,像睡著了一般题暖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捉超,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天胧卤,我揣著相機(jī)與錄音,去河邊找鬼拼岳。 笑死枝誊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惜纸。 我是一名探鬼主播叶撒,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼耐版!你這毒婦竟也來(lái)了祠够?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤椭更,失蹤者是張志新(化名)和其女友劉穎哪审,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體虑瀑,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡湿滓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舌狗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叽奥。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖痛侍,靈堂內(nèi)的尸體忽然破棺而出朝氓,到底是詐尸還是另有隱情,我是刑警寧澤主届,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布赵哲,位于F島的核電站,受9級(jí)特大地震影響君丁,放射性物質(zhì)發(fā)生泄漏枫夺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一绘闷、第九天 我趴在偏房一處隱蔽的房頂上張望橡庞。 院中可真熱鬧较坛,春花似錦、人聲如沸扒最。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吧趣。三九已至法竞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間再菊,已是汗流浹背爪喘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纠拔,地道東北人秉剑。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像稠诲,于是被迫代替她去往敵國(guó)和親侦鹏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是組合模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 一臀叙、...
    w1992wishes閱讀 883評(píng)論 0 2
  • 1 場(chǎng)景問(wèn)題# 1.1 商品類別樹(shù)## 考慮這樣一個(gè)實(shí)際的應(yīng)用:管理商品類別樹(shù)略水。 在實(shí)現(xiàn)跟商品有關(guān)的應(yīng)用系統(tǒng)的時(shí)候...
    七寸知架構(gòu)閱讀 5,999評(píng)論 10 59
  • 組合多個(gè)對(duì)象形成樹(shù)形結(jié)構(gòu)以表示具有“整體—部分”關(guān)系的層次結(jié)構(gòu)。組合模式對(duì)單個(gè)對(duì)象(即葉子對(duì)象)和組合對(duì)象(即容器...
    lyu571閱讀 488評(píng)論 0 1
  • 繼承是is-a的關(guān)系劝萤。組合和聚合有點(diǎn)像渊涝,有些書(shū)上沒(méi)有作區(qū)分,都稱之為has-a床嫌,有些書(shū)上對(duì)其進(jìn)行了較為嚴(yán)格區(qū)分跨释,組...
    時(shí)待吾閱讀 452評(píng)論 0 1
  • 組合模式的設(shè)計(jì)動(dòng)機(jī):組合模式定義了如何將容器對(duì)象和葉子對(duì)象進(jìn)行遞歸組合,使得客戶在使用的過(guò)程中無(wú)須進(jìn)行區(qū)分厌处,可以對(duì)...
    stepanoval閱讀 492評(píng)論 0 0