java設(shè)計模式08(組合模式)

組合模式用于組合多個對象形成樹形結(jié)構(gòu)以表示具有部分-整體關(guān)系的層次結(jié)構(gòu)硫眯。組合模式讓客戶端可以統(tǒng)一對待單個對象和組合對象忘朝。組合模式又可以稱為“部分-整體”模式,是一種對象結(jié)構(gòu)型模式泉坐。

組合模式使用面向?qū)ο蟮乃枷雭韺崿F(xiàn)樹形結(jié)構(gòu)的構(gòu)建與處理为鳄,描述了如何將容器對象和葉子對象進行遞歸組合,實現(xiàn)簡單腕让,靈活性好孤钦。

組合模式的結(jié)構(gòu)與實現(xiàn):
1.Component(抽象構(gòu)件):可以為抽象類或接口,為葉子構(gòu)件和容器構(gòu)件對象聲明接口纯丸,在該角色中可以包含所有子類共有行為的聲明偏形。在抽象構(gòu)件中定義了訪問及管理它的子構(gòu)件的方法,如增加子構(gòu)件觉鼻,刪除子構(gòu)件俊扭,獲取子構(gòu)件等。

public abstract class Component {

    public abstract void add(Component component);
    
    public abstract void remove(Component component);
    
    public abstract Component getChild(int node);
    
    public abstract void operation();
}

2.Composite(容器構(gòu)件):它在組合結(jié)構(gòu)中表示容器結(jié)點對象坠陈,容器結(jié)點包含子節(jié)點萨惑,其子結(jié)點可以是葉子結(jié)點捐康,也可以是容器結(jié)點,它提供一個集合用于儲存子結(jié)點庸蔼,實現(xiàn)了抽象構(gòu)件中定義的行為解总,包括那些訪問及管理子構(gòu)件的方法,在其業(yè)務方法中可以遞歸調(diào)用子結(jié)點的業(yè)務方法朱嘴。

public class Composite extends Component {
    
    private List<Component> list=new ArrayList<>();
    
    private String text;
    
    public Composite(String text) {
        this.text=text;
    }

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

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

    @Override
    public Component getChild(int node) {
        return list.get(node);
    }

    @Override
    public void operation() {
        System.out.println("獲取到構(gòu)件內(nèi)容:"+text);
        //遞歸調(diào)用構(gòu)件的方法
        for (Component component : list) {
            component.operation();
        }
    }

}

3.Leaf(葉子構(gòu)件):他在組合結(jié)構(gòu)中表示葉子結(jié)點對象倾鲫,葉子結(jié)點沒有子節(jié)點,它實現(xiàn)了在抽象構(gòu)件中定義的行為萍嬉。對于那些訪問及管理子構(gòu)件的方法乌昔,可以通過拋出異常,提示錯誤等方式處理壤追。

public class Leaf extends Component {
    
    private String text;
    
    public Leaf(String text) {
        this.text=text;
    }

    @Override
    public void add(Component component) {
        // 錯誤提示
    }

    @Override
    public void remove(Component component) {
        // 錯誤提示
    }

    @Override
    public Component getChild(int node) {
        // 錯誤提示
        return null;
    }

    @Override
    public void operation() {
        //葉子構(gòu)件具體業(yè)務方法的實現(xiàn)
        System.out.println("獲取到葉子結(jié)點內(nèi)容:"+text);
    }

}
  1. Test:
public class Test {
    
    public static void main(String[] args) {
        Component component1,component2;
        component1=new Composite("component1");
        component2=new Composite("component2");
        
        Component leaf1,leaf2,leaf3,leaf4;
        leaf1=new Leaf("component1+leaf1");
        leaf2=new Leaf("component1+leaf2");
        leaf3=new Leaf("component2+leaf3");
        leaf4=new Leaf("component2+leaf4");
        
        component1.add(leaf1);
        component1.add(leaf2);
        component2.add(leaf3);
        component2.add(leaf4);
        
        component1.operation();
        component2.operation();
    }

}

運行內(nèi)容:

獲取到構(gòu)件內(nèi)容:component1
獲取到葉子結(jié)點內(nèi)容:component1+leaf1
獲取到葉子結(jié)點內(nèi)容:component1+leaf2
獲取到構(gòu)件內(nèi)容:component2
獲取到葉子結(jié)點內(nèi)容:component2+leaf3
獲取到葉子結(jié)點內(nèi)容:component2+leaf4
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磕道,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子行冰,更是在濱河造成了極大的恐慌溺蕉,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悼做,死亡現(xiàn)場離奇詭異疯特,居然都是意外死亡,警方通過查閱死者的電腦和手機肛走,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門漓雅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朽色,你說我怎么就攤上這事邻吞。” “怎么了葫男?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵抱冷,是天一觀的道長。 經(jīng)常有香客問我梢褐,道長旺遮,這世上最難降的妖魔是什么盈咳? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任趣效,我火速辦了婚禮,結(jié)果婚禮上猪贪,老公的妹妹穿的比我還像新娘跷敬。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布西傀。 她就那樣靜靜地躺著斤寇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拥褂。 梳的紋絲不亂的頭發(fā)上娘锁,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天,我揣著相機與錄音饺鹃,去河邊找鬼莫秆。 笑死,一個胖子當著我的面吹牛悔详,可吹牛的內(nèi)容都是我干的镊屎。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼茄螃,長吁一口氣:“原來是場噩夢啊……” “哼缝驳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起归苍,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤用狱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拼弃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夏伊,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年吻氧,在試婚紗的時候發(fā)現(xiàn)自己被綠了署海。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡医男,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捻勉,到底是詐尸還是另有隱情镀梭,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布踱启,位于F島的核電站报账,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏埠偿。R本人自食惡果不足惜透罢,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冠蒋。 院中可真熱鬧羽圃,春花似錦、人聲如沸抖剿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脑融,卻和暖如春喻频,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肘迎。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工甥温, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妓布。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓姻蚓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秋茫。 傳聞我的和親對象是個殘疾皇子史简,可洞房花燭夜當晚...
    茶點故事閱讀 43,595評論 2 350

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