設計模式之組合模式

一.組合模式的定義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.但願用戶忽略組合對象與單個對象的不一樣,用戶將統一的使用組合結構中的全部對象。

相關文章
相關標籤/搜索