組合模式(Composite)

1、組合模式介紹html

組合模式:將對象組合成樹形結構以表示:部分--總體 的層次結構。組合模式使得用戶對單個對象和組合對象的使用具備一致性。java

java中的組合是指:在A類裏定義一個B類的引用,A擁有了B,叫組合。只是單純的組合而已,而不是一種設計模式。設計模式

組合和組合模式不是一回事!app

基本上見到的樹形結構都使用到了組合模式。框架

組合模式結構圖:ide

組合模式中有幾個核心的部分:post

Leaf(葉子):表示該節點下面沒有其餘子節點了,就稱爲葉子單元測試

Compostie(容器構件):容器構件,該節點下還有其餘子節點,理解爲一個容器,裏面包含了其餘子節點。就叫作容器構件學習

Component(抽象構件):抽象構件中定義了葉子和容器構件的共同點。好比,有公共的添加刪除葉子功能,有顯示節點功能。測試

例如:Windows中的文件管理

 

2、組合模式代碼實現

首先,定義一個抽象的Component。提供一系列的公共接口

1
2
3
4
5
6
7
8
9
10
11
//Component(抽象構件):抽象構件中定義了葉子和容器構件的共同點。好比,有公共的添加刪除葉子功能,有顯示節點功能。
public abstract class Component {
     protected String name;
     public Component(String name) {
         super ();
         this .name = name;
     }
     public abstract void add(Component c);
     public abstract void remove(Component c);
     public abstract void display( int depth);
}

而後定義具體的葉子節點,和容器節點

定義葉子節點,因爲葉子節點中沒有子節點了,因此不須要add和remove的具體實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//表示該節點下面沒有其餘子節點了,就稱爲葉子
public class Leaf extends Component {
     public Leaf(String name) {
         super (name);
     }
     @Override
     public void add(Component c) {
         System.out.println( "leaf no add" );
     }
     @Override
     public void remove(Component c) {
         System.out.println( "leaf no remove" );
     }
     @Override
     public void display( int depth) {
         StringBuffer sb = new StringBuffer( "-" );
         for ( int i = 0 ; i <= depth; i++) {
             sb.append( "-" );
         }
         System.out.println(sb.toString()+name);
     }
}

再定義一個容器節點

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.ArrayList;
import java.util.List;
 
//容器構件,該節點下還有其餘子節點,理解爲一個容器,裏面包含了其餘子節點。就叫作容器構件
public class Composite extends Component{
     private List<Component> children = new ArrayList<Component>();
     public Composite(String name) {
         super (name);
     }
     @Override
     public void add(Component c) {
         children.add(c);
     }
     @Override
     public void remove(Component c) {
         children.remove(c);
     }
     @Override
     public void display( int depth) {
         StringBuffer sb = new StringBuffer( "-" );
         for ( int i = 0 ; i <= depth; i++) {
             sb.append( "-" );
         }
         System.out.println(sb.toString()+name);
         for (Component com : children) {
             com.display(depth + 2 );
         }
     }
}

最後客戶端測試代碼:添加一個樹形結構

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void main(String[] args) {
     Composite root = new Composite( "root" );
     root.add( new Leaf( "Leaf A" ));
     root.add( new Leaf( "Leaf B" ));
     
     Composite comp = new Composite( "Composite X" );
     comp.add( new Leaf( "Leaf XA" ));
     comp.add( new Leaf( "Leaf XB" ));
     root.add(comp);
     
     Composite comp2 = new Composite( "Composite XY" );
     comp2.add( new Leaf( "Leaf XYA" ));
     comp2.add( new Leaf( "Leaf XYB" ));
     comp.add(comp2);
     
     root.add( new Leaf( "Leaf C" ));
     Leaf leaf = new Leaf( "Leaf D" );
     root.add(leaf);
//  root.remove(leaf);//這裏能夠刪除某節點
     root.display( 1 );
}

打印結果以下:

                ---root

                -----Leaf A

                -----Leaf B

                -----Composite X

                -------Leaf XA

                -------Leaf XB

                -------Composite XY

                ---------Leaf XYA

                ---------Leaf XYB

                -----Leaf C

                -----Leaf D

 

3、總結

開發中應用場景:

操做系統中的資源管理器

GUI中的容器層次圖

XML文件解析

OA系統中,組織結構的處理

Junit單元測試框架

 

 



Java23種設計模式學習筆記【目錄總貼】

參考資料:

  大話設計模式(帶目錄完整版).pdf

  HEAD_FIRST設計模式(中文版).pdf

  尚學堂_高淇_java300集最全視頻教程_【GOF23設計模式】

相關文章
相關標籤/搜索