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): 組合中的葉節點物件,葉節點物件不再擁有子節點;