設計模式(9) ——- 組合模式
- 利用組合模式來處理樹形結構,比如操作系統的目錄結構、應用軟件的菜單
- 組合模式通過一種巧妙的設計方案使得用戶可以一致性地處理整個樹形結構的一部分,亦可以一致性地處理樹形結構的葉子節點和容器節點。
組合模式概述
- 組合模式(Composite Pattern):組合多個對象形成樹形結構以表示具有“整體-部分”關係的層次結構。組合模式對單個對象(即葉子)和組合對象的使用具有一致性,組合模式又可以稱爲“整體-部分”(Part-Whole)模式,它是一種對象結構型模式。
注意:如果忘記了樹形結構,可以參考 <樹形結構-維基百科>;還有關於遞歸的思想可以自己 google
組合模式UML圖(不是很標準)
組合模式應用
這裏利用組合模式來實現目錄樹。爲了易讀,只是簡單實現,可以自己擴展。如果你對樹形結構有所瞭解,目錄樹就不在話下了,這裏直接上代碼。
package 組合模式; /** * @author kissx on 2017/2/12. */ public interface Node { void traversal(int depth); } //這裏的接口並沒有 add()、remove()方法,看個人喜好了,建議加上,這裏我就不叫了,,, package 組合模式; /** * @author kissx on 2017/2/12. */ public class File implements Node { private String name; public File(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void traversal(int depth) { for (int i = 0; i < depth; i++) { System.out.print("\t"); } System.out.println("|__" + name + ".file"); } } package 組合模式; import java.util.ArrayList; import java.util.List; /** * @author kissx on 2017/2/12. */ public class Folder implements Node{ private List<Node> files = new ArrayList<>(); private String name; public Folder(String name) { this.name = name; } public void add(Node node){ files.add(node); } //下面的方法很重要,可以說是實現組合模式的核心,理解好裏面的遞歸機制就差不多了 @Override public void traversal(int depth) { for (int i = 0; i < depth; i++) { System.out.print("\t"); } System.out.println(name); ++depth; for(Node node:files){ node.traversal(depth); } } public String getName() { return name; } public void setName(String name) { this.name = name; } } package 組合模式; /** * 測試類 * @author kissx on 2017/2/12. */ public class FileSystem { public static void main(String[] args) { Folder root = new Folder("Root"); File f1_1 = new File("測試1"); File f1_2 = new File("測試2"); root.add(f1_1); root.add(f1_2); Folder folder1 = new Folder("文件夾1_1"); Folder folder2 = new Folder("文件夾1_2"); root.add(folder1); root.add(folder2); File f11_1 = new File("測試3"); File f12_1 = new File("測試4"); folder1.add(f11_1); folder2.add(f12_1); Folder folder3 = new Folder("文件夾2_1"); folder1.add(folder3); File f21_1 = new File("測試5"); folder3.add(f21_1); root.traversal(0); } }
總結
- 組合模式就是用來處理樹形結構的。是不是感覺很奇妙,利用這種模式就可以很方便的實現樹的遍歷的。佩服 gang of four!