1 package com.shejimoshi.structural.Composite.type1; 2 3 4 /** 5 * 功能:將對象組合成樹形結構以表示“部分-整體”的層次結構。composite使得用戶對單個對象和組合對象的使用具有一致性 6 * 適用:想表示對象的部分-整體層次結構
1 package com.shejimoshi.structural.Composite.type1; 2 3 4 /** 5 * 功能:將對象組合成樹形結構以表示“部分-整體”的層次結構。composite使得用戶對單個對象和組合對象的使用具有一致性 6 * 適用:想表示對象的部分-整體層次結構 7 * 希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象 8 * 時間:2016年2月20日下午8:57:12 9 * 作者:cutter_point 10 */ 11 public abstract class Componment 12 { 13 protected String name; //名字 14 15 public Componment(String name) 16 { 17 this.name = name; 18 } 19 20 //幾個基本的方法,葉子節點和枝節點都需要的,葉子節點沒有子節點 21 public abstract void add(Componment c); 22 public abstract void remove(Componment c); 23 public abstract void display(int depth); //當前的深度 24 }
這裡再display的時候,有部分代碼很重覆,我覺得麻煩,我就在封裝了一個方法
1 package com.shejimoshi.structural.Composite.type1; 2 3 4 /** 5 * 功能:工具類 6 * 時間:2016年2月20日下午9:12:54 7 * 作者:cutter_point 8 */ 9 public class myutil 10 { 11 public static StringBuffer show(int depth) 12 { 13 //顯示名稱和深度就可以了 14 StringBuffer sb = new StringBuffer(); 15 for(int i = 0; i < depth; ++i) 16 sb.append("-"); 17 18 return sb; 19 } 20 }
葉子
1 package com.shejimoshi.structural.Composite.type1; 2 3 4 /** 5 * 功能:將對象組合成樹形結構以表示“部分-整體”的層次結構。composite使得用戶對單個對象和組合對象的使用具有一致性 6 * 適用:想表示對象的部分-整體層次結構 7 * 希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象 8 * 時間:2016年2月20日下午9:02:24 9 * 作者:cutter_point 10 */ 11 public class Leaf extends Componment 12 { 13 14 public Leaf(String name) 15 { 16 super(name); 17 } 18 19 @Override 20 public void add(Componment c) 21 { 22 //葉子是沒有子類的,他是葉子,所以添加和移除沒有意義 23 System.out.println("添加錯誤,葉子節點"); 24 } 25 26 @Override 27 public void remove(Componment c) 28 { 29 //葉子是沒有子類的,他是葉子,所以添加和移除沒有意義 30 System.out.println("刪除錯誤,葉子節點"); 31 } 32 33 @Override 34 public void display(int depth) 35 { 36 //顯示名稱和深度就可以了 37 StringBuffer sb = myutil.show(depth); 38 sb.append(this.name); 39 System.out.println(sb.toString()); 40 } 41 42 }
分支節點
1 package com.shejimoshi.structural.Composite.type1; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 7 /** 8 * 功能:將對象組合成樹形結構以表示“部分-整體”的層次結構。composite使得用戶對單個對象和組合對象的使用具有一致性 9 * 適用:想表示對象的部分-整體層次結構 10 * 希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象 11 * 時間:2016年2月20日下午9:09:45 12 * 作者:cutter_point 13 */ 14 public class Composite extends Componment 15 { 16 //這個是單個節點,樹枝節點,可以有子節點,我們用一個list存放我們的孩子節點 17 private List<Componment> children = new ArrayList<Componment>(); 18 19 public Composite(String name) 20 { 21 super(name); 22 } 23 24 @Override 25 public void add(Componment c) 26 { 27 //添加一個孩子節點 28 children.add(c); 29 } 30 31 @Override 32 public void remove(Componment c) 33 { 34 //刪除對應的節點 35 children.remove(c); 36 } 37 38 @Override 39 public void display(int depth) 40 { 41 //首先顯示當前節點信息 42 StringBuffer sb = myutil.show(depth); 43 sb.append(this.name); 44 System.out.println(sb.toString()); 45 46 //顯示相應的葉子的屬性 47 for(Componment c : children) 48 { 49 //吧深度添加一個標準 50 c.display(depth + 2); 51 }//for 52 } 53 54 }
測試代碼:
1 package com.shejimoshi.structural.Composite.type1; 2 3 4 /** 5 * 功能:測試組合模式 6 * 時間:2016年2月20日下午9:15:49 7 * 作者:cutter_point 8 */ 9 public class Test 10 { 11 public static void main(String[] args) 12 { 13 Composite root = new Composite("根"); 14 root.add(new Leaf("葉子A1")); 15 root.add(new Leaf("葉子A2")); 16 root.add(new Leaf("葉子A3")); 17 18 //第一個分支 19 Composite child1 = new Composite("分支A1"); 20 child1.add(new Leaf("葉子B1")); 21 child1.add(new Leaf("葉子B2")); 22 23 root.add(child1); //吧分支加進去 24 25 //分支可以再有分支,分支2 26 Composite child2 = new Composite("分支B1"); 27 child2.add(new Leaf("葉子C1")); 28 child2.add(new Leaf("葉子C2")); 29 30 child1.add(child2); 31 32 //根部在張葉子 33 root.add(new Leaf("葉子A4")); 34 Leaf leaf = new Leaf("葉子A5"); 35 root.add(leaf); 36 root.remove(leaf); 37 38 //顯示大樹,首先大樹根,那麼深度就是0 39 root.display(0); 40 } 41 }
結果:
根 --葉子A1 --葉子A2 --葉子A3 --分支A1 ----葉子B1 ----葉子B2 ----分支B1 ------葉子C1 ------葉子C2 --葉子A4