組合模式 - 哥氮双,我被我媽罵了

1 介紹


小白:大哥。我被我老媽罵了霎匈。/(ㄒoㄒ)/~~
Acey:為什么呀戴差?
小白:因為我昨天用完《多色按壓筆》后到處亂扔。 ,,???,,
Acey:活該铛嘱。 ε=( o`ω′)ノ
小白:.......暖释,不過罵完我之后,她還給我買了個筆盒墨吓。 O(∩_∩)O

多層筆盒

Acey:咳咳饭入,好騷氣的筆盒,還是多層的肛真。你媽真會選。不過看到這個筆盒我又想起了組合模式爽航,想不想知道是怎么回事呀蚓让?
小白:,好像沒的選吧讥珍。您老說吧历极。不過得講的我聽的懂才行哦。
Acey:No problem衷佃!

組合模式:又叫部分整體模式趟卸,是構造型模式的一種,是用于將一組類似的對象當做一個單個對象氏义,然后根據(jù)樹形結構組合對象锄列。

Acey:先來簡單的解釋一下吧」哂疲看你都要睡著了邻邮。。
小白: 好哇克婶。
Acey多種顏色的筆筆盒的每一層就相當于一組類似的對象筒严,而根據(jù)樹狀結構組合對象就是將每一層當作樹枝當作樹葉來組合起來情萤,從而形成一棵樹狀結構鸭蛙。

組合模式的幾個角色:

  • Component(枝干):提供管理子節(jié)點對象的接口方法。
  • Composite(樹枝):Component的實現(xiàn)類筋岛。
  • Leaf(葉子):Component的實現(xiàn)類娶视。

小白:額,


能來個實例就好了泉蝌?
Acey:好吧歇万,下面我們就來寫個小demo吧揩晴。

2 實現(xiàn)


一步,先把筆盒接口創(chuàng)建出來

PenBox.class

public interface PenBox {
    //添加一層或往當前層添加筆
    public void add(PenBox penbox);
    //移除當前層或移除當前層中存放的筆
    public void remove(PenBox penbox);
    //查看當前層或當前層中的筆
    public void display();
    //獲取筆盒中的所有層或當前層中的所有筆
    public List<PenBox> getChildren();
}

二步贪磺,創(chuàng)建一個筆盒層對象

Layer.class

public class Layer implements PenBox{

    private List<PenBox> layers;
    private String name;

    //給當前層一個名字
    public Layer(String name) {
        layers = new ArrayList<>();
        this.name = name;
    }
    //給當前層添加一支筆
    @Override
    public void add(PenBox penbox) {
        layers.add(penbox);
    }
    //移除當前層中的一支筆
    @Override
    public void remove(PenBox penbox) {
        layers.remove(penbox);
    }
    //顯示當前層的名稱
    @Override
    public void display() {
        System.out.println(name);
    }
    //獲取當前層中的所有筆
    @Override
    public List<PenBox> getChildren() {
        return this.layers;
    }

}

三步硫兰,創(chuàng)建筆對象

Pen.class

public class Pen implements PenBox{

    private String name;
    
    public Pen(String name) {
        this.name = name;
    }
    
    @Override
    public void add(PenBox penbox) {
    }

    @Override
    public void remove(PenBox penbox) {
    }
    //顯示當前筆
    @Override
    public void display() {
        System.out.println(name);
    }

    @Override
    public List<PenBox> getChildren() {
        return null;
    }

}

測試:MainClass.class

public class MainClass {
    public static void main(String[] args) {
        //創(chuàng)建一個筆盒,筆盒是一個特殊的層
        PenBox penBox = new Layer("筆盒");
        //為筆盒添加兩層
        PenBox penLayer = new Layer("第一層寒锚,裝中性筆");
        PenBox pencilLayer = new Layer("第二層劫映,裝鉛筆");
        //將第一層和第一層添加到筆盒中
        penBox.add(penLayer);
        penBox.add(pencilLayer);
        
        
        //向鉛筆層中添加三支筆
        pencilLayer.add(new Pen("紅色"));
        pencilLayer.add(new Pen("白色"));
        pencilLayer.add(new Pen("藍色"));
        
        //向中性筆層中添加三支筆
        penLayer.add(new Pen("紅色"));
        penLayer.add(new Pen("白色"));
        penLayer.add(new Pen("藍色"));
        
        //顯示筆盒中全部的筆
        display(penBox, 0);
    }
    //迭代打印整個筆盒
    public static void display(PenBox penbox,Integer deep){
        for(int i = 0; i < deep; ++i){
            System.out.print("-");
        }
        penbox.display();
        if(penbox instanceof Pen){
            return;
        }
        List<PenBox> children = penbox.getChildren();
        for(PenBox child : children){
            if(child instanceof Pen){
                for(int i = 0; i <= deep; ++i){
                    System.out.print("-");
                }
                child.display();
            }else{
                display(child, deep+1);
            }
        }
    }
}
運行結果

Acey:看,我們可以用遞歸將整個筆盒的結構輸出出來刹前,可以看到我們將筆盒分成了兩層泳赋。當然如果你還想加層的話也可以哦。
小白:soga喇喉,那可以在某一層中再加一層嘛祖今。??
Acey:可以啊,如果你想放什么小秘密的話拣技,也可以再在某一層中添加一層千诬。就像大樹的枝葉一樣可以無限延伸

3 特點


高層調(diào)用底層模塊簡單膏斤,而且子節(jié)點可以自由增加徐绑。適合用于部分、整體設計莫辨,如菜單傲茄,文件、文件夾等沮榜。

Acey:小白盘榨,你沒睡著吧。
小白:肯定沒有哇蟆融。待我在下去消化一下较曼。哈哈

喜歡的話戳一下喜歡唄。
有什么建議的話希望大家能在下方回復('')
上一篇:外觀模式 - 多色按壓筆你使過沒振愿?
下一篇:橋接模式 - 大/小白祝大家元旦Glücklich

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捷犹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冕末,更是在濱河造成了極大的恐慌萍歉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件档桃,死亡現(xiàn)場離奇詭異枪孩,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門蔑舞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拒担,“玉大人,你說我怎么就攤上這事攻询〈雍常” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵钧栖,是天一觀的道長低零。 經(jīng)常有香客問我,道長拯杠,這世上最難降的妖魔是什么掏婶? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮潭陪,結果婚禮上雄妥,老公的妹妹穿的比我還像新娘。我一直安慰自己依溯,他們只是感情好茎芭,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著誓沸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壹粟。 梳的紋絲不亂的頭發(fā)上拜隧,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音趁仙,去河邊找鬼洪添。 笑死,一個胖子當著我的面吹牛雀费,可吹牛的內(nèi)容都是我干的干奢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盏袄,長吁一口氣:“原來是場噩夢啊……” “哼忿峻!你這毒婦竟也來了?” 一聲冷哼從身側響起辕羽,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤逛尚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后刁愿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绰寞,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了滤钱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觉壶。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖件缸,靈堂內(nèi)的尸體忽然破棺而出铜靶,到底是詐尸還是另有隱情,我是刑警寧澤停团,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布旷坦,位于F島的核電站,受9級特大地震影響佑稠,放射性物質(zhì)發(fā)生泄漏秒梅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一舌胶、第九天 我趴在偏房一處隱蔽的房頂上張望捆蜀。 院中可真熱鬧,春花似錦幔嫂、人聲如沸辆它。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锰茉。三九已至,卻和暖如春切心,著一層夾襖步出監(jiān)牢的瞬間飒筑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工绽昏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留协屡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓全谤,卻偏偏與公主長得像肤晓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子认然,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

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

  • 1 場景問題# 1.1 商品類別樹## 考慮這樣一個實際的應用:管理商品類別樹补憾。 在實現(xiàn)跟商品有關的應用系統(tǒng)的時候...
    七寸知架構閱讀 6,014評論 10 59
  • 1 場景問題# 1.1 復雜的獎金計算## 考慮這樣一個實際應用:就是如何實現(xiàn)靈活的獎金計算。 獎金計算是相對復雜...
    七寸知架構閱讀 4,002評論 4 67
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理卷员,服務發(fā)現(xiàn)余蟹,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法子刮,類相關的語法威酒,內(nèi)部類的語法窑睁,繼承相關的語法,異常的語法葵孤,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 【蛻變新生】20170409學習力踐行D25:1担钮、昨天復習了八首古詩,斷句會接尤仍,大部分可以自己背下來箫津,背了兩首新的...
    高汝鑫閱讀 162評論 0 0