1. 程式人生 > >Java描述設計模式(10):組合模式

Java描述設計模式(10):組合模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡

一、生活場景

1、檔案系統

下圖是常見的計算機檔案系統的一部分。

檔案系統是一個樹結構,樹上長有節點。樹的節點有兩種:

  • 樹枝節點

即資料夾,有內部樹結構,在圖中塗有顏色;

  • 樹葉節點

另一種是檔案,即樹葉節點,沒有內部樹結構。

2、列印檔案樹結構

public class C01_InScene {
    public static void main(String[] args) {
        File file = new File("F:\\tree") ;
        fileTree(file, 0);
    }
    private static void fileTree(File file, int floor) {
        // 判斷是否存在
        if (file.exists()) {
            if (floor > 0) {
                // 迴圈打空格
                for (int i = 0; i < floor; i++) {
                    System.out.print(" ");
                }
            }
            if (file.isDirectory()) {
                System.out.println("+" + file.getName());
                // 列出所有檔案及資料夾
                File[] files = file.listFiles();
                if (null != files) {
                    // 迴圈遞迴
                    for (File dirFile : files) {
                        fileTree(dirFile, floor + 1);
                    }
                }
            } else {
                System.out.println("-" + file.getName());
            }
        }
    }
}

執行效果:+代表資料夾,-代表檔案。

+tree
 +dir1
  +dir2
   -dir2Leaf.txt
  -leaf1.txt
  -leaf2.txt
 -OneLeaf.txt
 -TwoLeaf.txt

3、組合模式描述

組合模式屬於物件的結構模式,有時又叫做“部分——整體”模式。組合模式將物件組織到樹結構中,可以用來描述整體與部分的關係。組合模式可以使客戶端將單純元素與複合元素同等看待。

二、組合模式-安全式

1、基礎概念

安全式的組合模式要求管理聚集的方法只出現在樹枝構件類中,而不出現在樹葉構件類中。涉及到三個角色:

  • 抽象構件(Component)角色

它給組合的物件定義出公共的介面及其預設行為,可以用來管理所有的子物件。組合物件通常把它所包含的子物件當做型別為Component的物件。在安全式的組合模式裡,構件角色並不定義出管理子物件的方法,這一定義由樹枝構件物件給出。

  • 樹葉構件(Leaf)角色

樹葉物件是沒有下級子物件的物件,定義出參加組合的原始物件的行為。

  • 樹枝構件(Composite)角色

代表參加組合的有下級子物件的物件。樹枝構件類給出所有的管理子物件的方法,如add()、remove()以及getChild()。

2、模式圖解

3、原始碼實現

public class C02_Security_Model {
    public static void main(String[] args) {
        Composite root = new Composite("服裝");
        Composite composite1 = new Composite("男裝");
        Leaf manCoat = new Leaf("上衣");
        Leaf manBottom = new Leaf("下衣");
        composite1.addChild(manCoat);
        composite1.addChild(manBottom);
        Composite composite2 = new Composite("女裝");
        Leaf leaf1 = new Leaf("鞋子");
        Leaf leaf2 = new Leaf("帽子");
        root.addChild(leaf1);
        root.addChild(leaf2);
        root.addChild(composite1);
        root.addChild(composite2);
        root.printStruct("");
    }
}
// 抽象構件角色類
interface Component {
    /*
     * 輸出元件自身的名稱
     */
    void printStruct(String preStr);
}
// 樹枝構件角色類
class Composite implements Component{
    // 用來儲存組合物件中包含的子元件物件
    private List<Component> childComponents = new ArrayList<Component>();
    // 輸出物件的名稱
    private String name;
    // 構造方法,傳入組合物件的名字
    public Composite (String name){
        this.name = name;
    }
    /**
     * 聚集管理方法,增加一個子構件物件
     * @param child 子構件物件
     */
    public void addChild(Component child){
        childComponents.add(child);
    }
    /**
     * 聚集管理方法,刪除一個子構件物件
     * @param index 子構件物件的下標
     */
    public void removeChild(int index){
        childComponents.remove(index);
    }
    /**
     * 聚集管理方法,返回所有子構件物件
     */
    public List getChild(){
        return childComponents ;
    }
    /**
     * 輸出物件的自身結構
     * @param preStr 字首,主要是按照層級拼接空格,實現向後縮排
     */
    @Override
    public void printStruct(String preStr) {
        //先輸出自己
        System.out.println(preStr+"+"+this.name);
        //如果還包含有子元件,那麼就輸出這些子元件物件
        if (this.childComponents != null){
            //新增兩個空格,表示向後縮排兩個空格
            preStr = preStr+"  ";
            //輸出當前的子物件:使用函式遞迴的原理
            for (Component c : childComponents) {
                c.printStruct(preStr);
            }
        }
    }
}
class Leaf implements Component{
    // 輸出葉子物件的名稱
    private String name;
    // 構造方法,傳入葉子物件的名稱
    public Leaf (String name){
        this.name = name ;
    }
    /**
     * 輸出葉子物件的結構,葉子物件沒有子物件,也就是輸出葉子物件的名字
     * @param preStr 字首,主要是按照層級拼接的空格,實現向後縮排
     */
    @Override
    public void printStruct(String preStr) {
        System.out.println(preStr+"-"+name);
    }
}
  • 輸出結果
+服裝
  -鞋子
  -帽子
  +男裝
    -上衣
    -下衣
  +女裝

三、組合模式-透明式

1、概念圖解

與安全式的組合模式不同的是,透明式的組合模式要求所有的具體構件類,不論樹枝構件還是樹葉構件,均符合一個固定介面。

2、原始碼實現

public class C03_Transparent_Model {
    public static void main(String[] args) {
        Component1 root = new Composite1("服裝");
        Component1 c1 = new Composite1("男裝");
        Component1 c2 = new Composite1("女裝");
        Component1 leaf1 = new Leaf1("襯衫");
        Component1 leaf2 = new Leaf1("夾克");
        Component1 leaf3 = new Leaf1("裙子");
        Component1 leaf4 = new Leaf1("套裝");
        root.addChild(c1);
        root.addChild(c2);
        c1.addChild(leaf1);
        c1.addChild(leaf2);
        c2.addChild(leaf3);
        c2.addChild(leaf4);
        root.printStruct("");
    }
}
abstract class Component1 {
    /**
     * 輸出元件自身的名稱
     */
    public abstract void printStruct(String preStr);
    // 聚集管理方法,增加一個子構件物件
    public void addChild(Component1 child){
        /**
         * 預設實現,丟擲異常,因為葉子物件沒有此功能
         * 或者子元件沒有實現這個功能
         */
        throw new UnsupportedOperationException("物件不支援此功能");
    }
    // 聚集管理方法,刪除一個子構件物件
    public void removeChild(int index){
        /**
         * 預設實現,丟擲異常,因為葉子物件沒有此功能
         * 或者子元件沒有實現這個功能
         */
        throw new UnsupportedOperationException("物件不支援此功能");
    }
    // 聚集管理方法,返回所有子構件物件
    public List<Component1> getChild(){
        /**
         * 預設實現,丟擲異常,因為葉子物件沒有此功能
         * 或者子元件沒有實現這個功能
         */
        throw new UnsupportedOperationException("物件不支援此功能");
    }
}
class Composite1 extends Component1 {
    // 用來儲存組合物件中包含的子元件物件
    private List<Component1> childComponents = new ArrayList<Component1>();
    // 輸出物件名稱
    private String name ;
    public Composite1 (String name){
        this.name = name;
    }
    /**
     * 聚集管理方法,增加一個子構件物件
     * @param child 子構件物件
     */
    public void addChild(Component1 child){
        childComponents.add(child);
    }
    /**
     * 聚集管理方法,刪除一個子構件物件
     * @param index 子構件物件的下標
     */
    public void removeChild(int index){
        childComponents.remove(index);
    }
    // 聚集管理方法,返回所有子構件物件
    public List<Component1> getChild(){
        return childComponents ;
    }
    /**
     * 輸出物件的自身結構
     * @param preStr 字首,主要是按照層級拼接空格,實現向後縮排
     */
    @Override
    public void printStruct(String preStr) {
        // 首先輸出自己名稱
        System.out.println(preStr+"+"+this.name);
        // 如果還包含有子元件,那麼就輸出這些子元件物件
        preStr = preStr + "  ";
        if (this.childComponents != null) {
            // 新增兩個空格,表示向後縮排
            for (Component1 c : childComponents) {
                ////遞迴輸出每個子物件
                c.printStruct(preStr);
            }
        }
    }
}
class Leaf1 extends Component1 {
    private String name;
    public Leaf1 (String name){
        this.name = name;
    }
    /**
     * 輸出葉子物件的結構,葉子物件沒有子物件,也就是輸出葉子物件的名字
     * @param preStr 字首,主要是按照層級拼接的空格,實現向後縮排
     */
    @Override
    public void printStruct(String preStr) {
        System.out.println(preStr+"-"+name);
    }
}

四、JDK中應用

1、HashMap結構圖

2、分層結構

  • interface Map
  • class AbstractMap implements Map
  • HashMap extends AbstractMap implements Map
  • interface Map.Entry
  • Node implements Map.Entry

3、原始碼

  • 儲存葉子節點
public V put(K var1, V var2) {
    return this.putVal(hash(var1), var1, var2, false, true);
}
final V putVal(int var1, K var2, V var3, boolean var4, boolean var5) {
    HashMap.Node[] var6 = this.table;
    .......
}
  • 儲存樹枝節點
public void putAll(Map<? extends K, ? extends V> var1) {
    this.putMapEntries(var1, true);
}

五、原始碼地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

相關推薦

Java描述設計模式(10)組合模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 1、檔案系統 下圖是常見的計算機檔案系統的一部分。

Java設計模式10 策略模式

一、什麼是策略模式? 策略模式屬於物件的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。 策略模式把一個系列的演算法封裝到一個系列的具體策略類裡面,作為一個抽象策略類的子類或

Java設計模式8組合模式(Composite)

組合模式(Composite) 意圖 將物件組合成樹形結構已表示“部分-整體”的層次結構。Composite使得使用者對單個物件和組合物件的使用具有一致性 適用性 1、你想表示物件的部分-整體層次i結構 2、你希望使用者忽略組合物件與單個休想的

設計模式系列組合模式

○ 種一棵樹最好的時間是十年前,其次是現在 ○ 堅持輸出,堅持書寫,才可以持續成長 ○ 所有美好事物的成長都是緩慢的 ○ 既往不戀,未來不迎,當下不雜 ○ 業精於勤,荒於嬉,行成於思,毀於隨 ○將軍趕路 不追小兔 ○不要拘泥於語言,同樣也不要拘泥於行業,眼光放遠一點

《Head First 設計模式組合模式

# 正文 ## 一、定義 組合模式允許你將物件合成樹形結構來表現“整體/部分”層次結構。組合能讓客戶以一致的方式處理組合物件以及個體物件。 * 組合物件:包含其他元件的元件。 * 個體物件(葉節點物件):沒有包含其他元件的元件。 ![](https://img2020.cnblogs.com/blog

JAVA設計模式組合模式

層次結構 lines end fadein java trac 抽象類 ddc 單個 組合(總體與部分關系)模式:將不同可是相關的對象組合成樹形結構以實現“部分-總體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。 * 模式角色組成:

Java描述設計模式(02)簡單工廠模式

一、生活場景簡介 1、引入場景 訂餐流程簡單描述 1)、食品抽象類,規定食品的基礎屬性操作 2)、魚類,雞肉類食品類擴充套件 3)

Java描述設計模式(08)橋接模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、橋接模式簡介 1、基礎描述 橋樑模式是物件的結構模式。又稱為柄

Java描述設計模式(09)裝飾模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 1、場景描述 孫悟空有七十二般變化,他的每一種變化都

Java描述設計模式(11)觀察者模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、觀察者模式 1、概念描述 觀察者模式是物件的行為模式,又叫釋出

Java描述設計模式(13)迭代器模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、迭代器模式 1、基礎概念 迭代器模式又叫遊標模式,是物件的行為

Java描述設計模式(17)調停者模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 1、場景描述 在公司的日常安排中,通常劃分多個部門,每個部門又會分為不同的小組,部門經理的一項核心工作就是協調部門小組之間的工作,例如開發小組,產品小組,小組的需求統一彙總到經理,經理統一安排和協調。 2、場景圖解 3、程式碼實

Java描述設計模式(18)享元模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、使用場景 應用程式碼 public class C01_InScene { public static void main(String[] args) { String c0 = "cicada" ; S

Java描述設計模式(19)模板方法模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 通常一款網際網路應用的開發流程如下:業務需求,規劃產品,程式開發,測試交付。現在基於模板方法模式進行該過程描述。 public class C01_InScene { public static void main(String

Java描述設計模式(23)訪問者模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 1、場景描述 電競是遊戲比賽達到“競技”層面的體育專案。利用電子裝置作為運動器械進行的、人與人之間的智力對抗運動。通過電競,可以提高人的反應能力、協調能力、團隊精神等。但是不同人群的對電競的持有的觀念不一樣,有的人認為電競就是沉迷網路,

設計模式之八組合模式(Composite Pattern)

數據結構 log ide ase 統一 etc 方法 可能 模式 什麽是組合模式呢?簡單來說組合模式就是將對象合成樹形結構以表示“部分整體”的層次結構,組合模式使用戶對單個對象和組合對象使用具有一致性。 組合模式(Composite Pattern)有時

Java進階篇設計模式之六 ----- 組合模式和過濾器模式

對組 www. 希望 als oid block 個人 定義 lsi 前言 在上一篇中我們學習了結構型模式的外觀模式和裝飾器模式。本篇則來學習下組合模式和過濾器模式。 組合模式 簡介 組合模式是用於把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象,用來表

Java設計模式8外觀模式

一、外觀模式的定義: 外觀模式隱藏了系統的複雜性,並向客戶端提供了一個可以訪問系統的介面。這種型別的設計模式屬於結構性模式。為子系統中的一組介面提供了一個統一的訪問介面,這個介面使得子系統更容易被訪問或者使用。  二、外觀模式的結構: 1、外觀角色:外觀模式的核心。它

Java設計模式12命令模式

一、什麼是命令模式? 在閻巨集博士的《JAVA與模式》一書中開頭是這樣描述命令(Command)模式的: 命令模式屬於物件的行為模式。命令模式又稱為行動(Action)模式或交易(Transaction)模式。 命令模式把一個請求或者操作封裝到一個物件中。命令模式允許系統使用不同的請

小白設計模式組合模式

定義 將物件組合成樹形結構來表現出“整體/部分”的層次結構。組合能讓客戶以一致性的方式處理個別的物件以及物件組合。 主要組成 抽象元件(Component): 為組合中的物件(節點或者元件)宣告介面,也可提供預設的介面預設實現; 節點物件(Leaf): 組合中的葉節點物件,葉節點物件不再擁有子節點;