##定義 將對象組合成樹形結構表示總體-部分的層次結構,使得用戶對每一個單個對象和組合對象的使用具備一致性bash
##使用場景 表示對象的部分-總體層次結構時 從一個總體中可以獨立出部分模塊或功能的場景markdown
##模式結構ide
##簡單實現 操做系統的文件系統就是一種典型的組合模式例子,Android中View與ViewGroup構成的UI體系也是很典型的實現。 下面以一個簡單的文件系統來作說明this
public abstract class Dir { /** * 聲明一個 list 成員變量存儲文件夾下的全部元素 */ protected List<Dir> dirs = new ArrayList<>(); private String name; public Dir(String name) { this.name = name; } /** * 添加一個文件或文件夾 * * @param dir 文件或文件夾 */ public abstract void addDir(Dir dir); /** * 刪除一個文件或文件夾 * * @param dir 文件或文件夾 */ public abstract void rmDir(Dir dir); /** * 清空文件夾下全部元素 */ public abstract void clear(); /** * 輸出文件夾目錄結構 */ public abstract void print(); /** * 獲取文件夾下全部文件或子文件夾 * * @return 文件夾下全部文件或子文件夾 */ public abstract List<Dir> getFiles(); /** * 獲取文件或文件夾名 * * @return 文件或文件夾名 */ public String getName() { return name; } } 複製代碼
public class File extends Dir { public File(String name) { super(name); } @Override public void addDir(Dir dir) { throw new UnsupportedOperationException("文件對象不支持該操做"); } @Override public void rmDir(Dir dir) { throw new UnsupportedOperationException("文件對象不支持該操做"); } @Override public void clear() { throw new UnsupportedOperationException("文件對象不支持該操做"); } @Override public void print() { System.out.print(getName()); } @Override public List<Dir> getFiles() { throw new UnsupportedOperationException("文件對象不支持該操做"); } } 複製代碼
文件爲葉子節點,不能做爲文件夾來使用,它相對於文件夾來講既不支持添加也不支持刪除,這裏直接拋出一個不支持異常來簡單處理。spa
public class Folder extends Dir { public Folder(String name) { super(name); } @Override public void addDir(Dir dir) { dirs.add(dir); } @Override public void rmDir(Dir dir) { dirs.remove(dir); } @Override public void clear() { dirs.clear(); } @Override public void print() { System.out.print(getName() + " ("); Iterator<Dir> iterator = dirs.iterator(); while (iterator.hasNext()) { Dir dir = iterator.next(); dir.print(); if (iterator.hasNext()) { System.out.print(", "); } } System.out.print(") "); } @Override public List<Dir> getFiles() { return dirs; } } 複製代碼
public class Client { public static void main(String[] args) { Dir disk = new Folder("木葉"); File file = new File("火影"); disk.addDir(file); Dir high = new Folder("上忍"); disk.addDir(high); Dir low = new Folder("下忍"); disk.addDir(low); Dir elite = new Folder("精英上忍"); high.addDir(elite); elite.addDir(new File("卡卡西 ")); Dir general = new Folder("普通上忍"); high.addDir(general); general.addDir(new File("寧次")); low.addDir(new File("鳴人")); low.addDir(new File("佐助")); disk.print(); System.out.println("\n---------------------\n"); disk.rmDir(file); disk.print(); } } 複製代碼
輸出結果:操作系統
木葉 (火影, 上忍 (精英上忍 (卡卡西 ) , 普通上忍 (寧次) ) , 下忍 (鳴人, 佐助) ) --------------------- 木葉 (上忍 (精英上忍 (卡卡西 ) , 普通上忍 (寧次) ) , 下忍 (鳴人, 佐助) ) Process finished with exit code 0 複製代碼