Java設計模式之組合模式

2021-08-11 03:49:49 字數 2182 閱讀 7675

介紹

我們的計算機都擁有檔案系統,資料夾裡面既可以放入檔案,也可以放入子資料夾。在子資料夾中,一樣地既可以放入檔案,也可以放入子資料夾。檔案系統是一種容器結構、遞迴結構。

組合模式就是用於創造出這樣的結構的模式。組合模式又叫部分整體模式,用於把一組相似的物件當做乙個單一的物件,它將物件組合成樹形結構以表示「部分-整體」的層次結構,使得使用者對單個物件和組合物件的使用具有一致性。

實現

在組合模式中,一共有以下幾個角色:

leaf(樹葉)

表示「內容」的角色。該角色不能放入其他的物件。

composite(複合物)

表示容器的角色。可以在其中放入leaf角色和composite角色。

component

使leaf角色和composite角色具有一致性的角色。component角色是leaf角色和composite角色的父類。

client

組合模式的使用者。

以檔案系統的顯示為例,我們寫一段示例程式。

entry類(扮演component角色)

public abstract class entry 

public string getname()

public abstract entry add(entry entry);

public abstract boolean delete(entry entry);

public abstract linkedlist getchild();

}

directory類(扮演composite角色)
public class directory extends entry 

@override

public entry add(entry entry)

@override

public boolean delete(entry entry)

@override

public linkedlistgetchild()

}

file類(扮演leaf角色)
public class file extends entry 

@override

public entry add(entry entry)

@override

public boolean delete(entry entry)

@override

public linkedlist getchild()

}

client類(扮演client角色)
public class client 

public static void showdirectory(entry entry, string prefix) else

}if (entry.getchild().size() == 0)

} else }}

輸出結果
/root/tmp

/root/home

/root/usr/bin

/root/usr/lib

tips上面的實現方式為透明模式的組合模式,即add()、remove()、getchild()方法在父類申明,不管directory類還是file類都可見,如果使用不當呼叫了file類的實現方法,程式會丟擲異常。

因此,組合模式還有另外一種實現方式→安全模式,即將add()、remove()、getchild()方法單獨放在directory類中,file類無法呼叫。類圖如下:

組合模式總結

java設計模式之組合模式

組合模式 允許你將物件組合成樹形結構來表現 整體 部分 層次結構。組合能讓客戶以一致的方式處理個別物件以及物件組合。組合模式類圖 client 客戶使用component介面操作組合中的物件。component component為組合中的所有物件定義乙個介面,不管是組合還是節點,component...

java設計模式之組合模式

一 組合模式簡介 組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構。composite使得使用者對單個物件和組合物件的使用具有一致性。有時候又叫做部分 整體模式,它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程式可以向處理簡單元素一樣來處理複雜元素,從而使得客戶程式與複雜...

《Java設計模式之組合模式》

組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。新增節點 public abstract void add component c 刪除節點 public abstract void remove component c 顯示節點...