組合模式

組合模式

通過將單個(gè)對象和組合對象用相同的接口表示恤批,使得客戶端對單個(gè)對象和組合對象保存一致的處理弃揽,屬于結(jié)構(gòu)型模式。

使用場景

  1. 希望客戶端可以忽略單個(gè)和整體對象的差異
  2. 對象層次具備整體和部分,通常成樹形結(jié)構(gòu)(公司的組織架構(gòu),操作系統(tǒng)的文件目錄茅茂, 樹形菜單等)

具體實(shí)現(xiàn)(2種)

主要是部分和整體實(shí)現(xiàn)公共的接口捏萍。

  1. 透明實(shí)現(xiàn)(部分與整體差異小,不經(jīng)常變動(dòng))空闲,接口擁有所有方法令杈,沒有權(quán)限或調(diào)用功能直接拋出異常
  2. 安全實(shí)現(xiàn)(部分與整體差異較大),接口只有公共方法碴倾,各自有獨(dú)立的方法

透明模式demo(對比安全模式逗噩,主要在接口定義上不一樣)

package com.lovingmo.spdemo01.demo.compose;

public abstract class Directory {
    public void show(){};
    // 這個(gè)方法在File中用不上,但是會(huì)被繼承或?qū)崿F(xiàn)跌榔,調(diào)用拋出異常
    public Directory  add(Directory  directory ){
          throw new RuntimeException("添加異常");
    }
}

安全模式demo

Directory.java

package com.lovingmo.spdemo01.demo.compose;

public abstract class Directory {
    public void show(){};
}

File.java

package com.lovingmo.spdemo01.demo.compose;

public class File extends Directory{
    private String name;

    public File(String name) {
        this.name = name;
    }

    @Override
    public void show() {
        System.out.println(this.name);
    }
}

Folder.java

package com.lovingmo.spdemo01.demo.compose;

import java.util.ArrayList;
import java.util.List;

public class Folder extends Directory{
    private List<Directory> directories;
    private String name;
    private Integer level;

    public Folder(String name, int level) {
        this.name = name;
        this.level = level;
        this.directories = new ArrayList<>();
    }

    public Directory add(Directory directory){
        directories.add(directory);
        return directory;
    }

    @Override
    public void show() {
        System.out.println(this.name);
        for (Directory directory : directories){
            if(this.level != null){
                for (int a = 0; a< this.level; a++){
                    System.out.print("   ");
                }
                for(int  i = 0; i < this.level; i ++){
                    //每一行開始打印一個(gè)+號(hào)
                    if(i == 0){ System.out.print("+"); }
                    System.out.print("-");
                }
            }
            directory.show();
        }
    }
}

Test.java

package com.lovingmo.spdemo01.demo.compose;
public class Test {
    public static void main(String[] args) {
        File idea = new File("idea.exe");
        File mysql = new File("mysql.exe");
        Folder games = new Folder("游戲", 2);
        File lol = new File("lol.exe");
        File dnf = new File("dnf.exe");
        games.add(lol);
        games.add(dnf);
        Folder root = new Folder("D:/", 1);
        root.add(games);
        root.add(idea);
        root.add(mysql);
        root.show();
    }
}

源碼中的使用

  1. HashMap中的put()與putAll()
  2. ArrayList中的add()與addAll()

優(yōu)點(diǎn)

  1. 清楚的定義分層次的復(fù)雜對象异雁,表示對象的全部和部分層次
  2. 讓客戶端忽略對層次的差異,方便對整個(gè)層次結(jié)構(gòu)進(jìn)行控制
  3. 簡化客戶端代碼
  4. 符合開閉原則

缺點(diǎn)

  1. 限制類型時(shí)較為復(fù)雜
  2. 設(shè)計(jì)時(shí)更加抽象
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末僧须,一起剝皮案震驚了整個(gè)濱河市纲刀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌担平,老刑警劉巖示绊,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異暂论,居然都是意外死亡面褐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門取胎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來展哭,“玉大人,你說我怎么就攤上這事扼菠。” “怎么了坝咐?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵循榆,是天一觀的道長。 經(jīng)常有香客問我墨坚,道長秧饮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任泽篮,我火速辦了婚禮盗尸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帽撑。我一直安慰自己泼各,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布亏拉。 她就那樣靜靜地躺著扣蜻,像睡著了一般逆巍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莽使,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天锐极,我揣著相機(jī)與錄音,去河邊找鬼芳肌。 笑死灵再,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亿笤。 我是一名探鬼主播翎迁,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼责嚷!你這毒婦竟也來了鸳兽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤罕拂,失蹤者是張志新(化名)和其女友劉穎揍异,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爆班,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衷掷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柿菩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戚嗅。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖枢舶,靈堂內(nèi)的尸體忽然破棺而出懦胞,到底是詐尸還是另有隱情,我是刑警寧澤凉泄,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布躏尉,位于F島的核電站,受9級(jí)特大地震影響后众,放射性物質(zhì)發(fā)生泄漏胀糜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一蒂誉、第九天 我趴在偏房一處隱蔽的房頂上張望教藻。 院中可真熱鬧,春花似錦右锨、人聲如沸括堤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痊臭。三九已至哮肚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間广匙,已是汗流浹背允趟。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸦致,地道東北人潮剪。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像分唾,于是被迫代替她去往敵國和親抗碰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

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