設計模式-組合模式(Composite)
阿新 • • 發佈:2018-12-05
組合模式是構造型模式的一種。通過遞迴手段來構造樹形的物件結構,並可以通過一個物件來訪問整個物件樹
角色和職責:
就是資料夾那種形式,樹形
UML圖:
具體程式碼:
import java.util.List; /** * Ifile 統一介面 */ public interface Ifile { void display();//顯示 boolean add(Ifile file);//新增 boolean remove(Ifile file);//刪除 List<Ifile> getChild();//獲取孩子節點 }
import java.util.List; /** * 檔案 */ public class File implements Ifile{ private String fileName;//檔名 public File(String fileName){ this.fileName = fileName; } @Override public void display() { System.out.println(fileName); } @Override publicboolean add(Ifile file) { return false; } @Override public boolean remove(Ifile file) { return false; } @Override public List<Ifile> getChild() { return null; } }
import java.util.ArrayList; import java.util.List; /** * 目錄 */ public classFolder implements Ifile{ private String fileName;//檔名 private List<Ifile> list = null;//目錄集合 public Folder(String fileName){ this.fileName = fileName; this.list = new ArrayList<Ifile>(); } @Override public void display() { System.out.println(fileName); } @Override public boolean add(Ifile file) { this.list.add(file); return true; } @Override public boolean remove(Ifile file) { this.list.add(file); return true; } @Override public List<Ifile> getChild() { return this.list; } }
import java.util.List; public class Main { public static void main(String[] args) { Ifile folder_d = new Folder("d:"); Ifile file_d_aa = new File("aa.txt"); Ifile folder_d_dingding = new Folder("dingding"); Ifile folder_d_dingding_bin = new Folder("bin"); Ifile file_d_dingding_b = new File("可執行檔案.exe"); Ifile file_d_dingding_bin_b = new File("mm.exe"); Ifile file_d_bb = new File("bb.txt"); folder_d_dingding_bin.add(file_d_dingding_bin_b); folder_d_dingding.add(folder_d_dingding_bin); folder_d_dingding.add(file_d_dingding_b); folder_d.add(file_d_aa); folder_d.add(folder_d_dingding); folder_d.add(file_d_bb); show(folder_d,0);//顯示當前目錄下的節點 } /** * 顯示當前目錄下的節點 * @param file */ public static void show(Ifile file,int deep){ for(int m=0;m<deep;m++){ System.out.print("--"); } List<Ifile> list = file.getChild(); for(int i = 0; i<list.size();i++){ Ifile fi = list.get(i); System.out.print("--"); if(fi instanceof File){ for(int n=0;n<deep-1;n++){ System.out.print("--"); } fi.display(); }else{ fi.display(); show(fi,++deep); } } } }
優缺點:
優:
- 可以清楚地定義分層次的複雜型別,表示物件的全部層次或者部分層次 ,它讓客戶端忽略了層次的差異,方便對整個層次經行控制
- 客戶端可以一致的使用一個組合模式或對單個物件,不必關心處理的是單個物件還是整個組合結構,簡化了客戶端的程式碼
- 在組合模式種增加新的容器構件和葉子構件都很方便,無需對現有類庫進行任何修改,符合開閉原則。
- 為樹形結構的面向物件實現提供了一種靈活的解決方案,通過葉子物件和容器物件的遞迴組合可以形成複雜的樹形機構,但對樹形結構的控制卻很簡單
應用場景:
在一個使用面嚮物件語言開發的系統中需要處理一個樹形結構的
在一個系統中能分離出葉子和容器的,而且他們的型別還固定不變,需要增加一些新的型別
原始碼地址:https://github.com/qjm201000/design_pattern_composite.git