一.組合模式的定義ide
組合模式將對象組合成樹狀結構以表示「總體-部分」的層次關係;測試
組合模式使得用戶對單個對象和組合對象的訪問具備一致性。this
二.組合模式的角色及職責spa
1.Componentcode
這是組合中的對象聲明接口,在適當的狀況下,實現全部類共有接口的默認行爲。聲明一個接口用於訪問和管理Component子部件。對象
2.Leafblog
在組合中表示葉子節點對象,葉子節點沒有子節點。接口
3.Compositerem
定義有枝節點行爲,用來存儲子部件,在Component接口中實現與子部件有關的操做,如增長(add)和刪除(remove)等。get
組合模式的UML圖:
實例代碼以下:
1 public abstract class Component { 2 private String name; 3 4 public void setName(String name) { 5 this.name = name; 6 } 7 8 public String getName() { 9 return name; 10 } 11 12 protected abstract void add(Component c); 13 14 protected abstract void remove(Component c); 15 16 protected abstract void display(int depth); 17 }
1 public class Leaf extends Component { 2 3 public Leaf(String name){ 4 setName(name); 5 } 6 7 @Override 8 protected void add(Component c) { 9 //葉子節點不能添加子節點,所以不作實現 10 } 11 12 @Override 13 protected void remove(Component c) { 14 //葉子節點不能添加子節點,所以不作實現 15 } 16 17 @Override 18 protected void display(int depth) { 19 String temp = ""; 20 for (int i=0; i<depth; i++){ 21 temp += "-"; 22 } 23 System.out.println(temp + getName()); 24 } 25 }
1 public class Composite extends Component { 2 private List<Component> children = new ArrayList<>(); 3 4 public Composite(String name){ 5 setName(name); 6 } 7 8 @Override 9 protected void add(Component c) { 10 children.add(c); 11 } 12 13 @Override 14 protected void remove(Component c) { 15 children.remove(c); 16 } 17 18 @Override 19 protected void display(int depth) { 20 String temp = ""; 21 for (int i=0; i<depth; i++){ 22 temp += "-"; 23 } 24 System.out.println(temp + getName()); 25 26 for (Component child : children){ 27 child.display(depth + 2); 28 } 29 } 30 }
如下是測試類:
1 public class CompositeTest { 2 3 public static void main(String[] args) { 4 Component root = new Composite("根節點"); 5 6 Component leftChild = new Composite("左節點"); 7 Component rightChild = new Composite("右節點"); 8 9 Component leftChild_1 = new Leaf("左節點-葉子1"); 10 Component leftChild_2 = new Leaf("左節點-葉子2"); 11 12 Component rightChild_leaf = new Leaf("右節點—葉子"); 13 14 leftChild.add(leftChild_1); 15 leftChild.add(leftChild_2); 16 17 rightChild.add(rightChild_leaf); 18 19 root.add(leftChild); 20 root.add(rightChild); 21 22 root.display(1); 23 } 24 25 }
運行結果以下:
三.組合模式的使用場景
1.想要表示對象的總體-部分的層次結構。
2.但願用戶忽略組合對象與單個對象的不一樣,用戶將統一的使用組合結構中的全部對象。