GOF23設計模式之組合模式(composite)

1、組合模式概述

  將對象組合成樹狀結構以表示「部分和總體」層次結構,使得客戶能夠統一的調用葉子對象和容器對象。java

  (1)組合模式的使用場景架構

      把部分和總體的關係用樹形結構來表示,從而使客戶端能夠使用統一的方式處理部分對象和總體對象。框架

  (2)組合模式核心ide

      抽象構件(Component)角色:定義了葉子和容器構件的共同點單元測試

      葉子(Leaf)構件角色:無子節點測試

      容器(Composite)構件角色:有容器特徵,能夠包含子節點this

 1 /**
 2  * 抽象組件
 3  * @author CL
 4  *
 5  */
 6 public interface Component {
 7     void operation();
 8 }
 9 
10 /**
11  * 葉子組件
12  * @author CL
13  *
14  */
15 interface Leaf extends Component {
16 }
17 
18 /**
19  * 容器組件
20  * @author CL
21  *
22  */
23 interface Composite extends Component {
24     void add(Component c);
25     void remove(Component c);
26     Component getChild(int index);
27 }

2、組合模式工做流程分析

  (1)組合模式爲處理樹形結構提供了完美的解決方案,描述瞭如何將容器和葉子進行遞歸組合,使得用戶在使用時能夠一致性的對待容器和葉子。spa

  (2)當容器對象的指定方法被調用時,將遍歷整個樹形結構,尋找也包含這個方法的成員,並調用執行。其中,使用了遞歸調用的機制對整個結構進行處理。操作系統

3、使用組合模式模擬殺毒軟件架構設計

  1 import java.util.ArrayList;
  2 import java.util.List;
  3 
  4 /**
  5  * 模擬殺毒軟軟件架構設計
  6  * 抽象組件
  7  * @author CL
  8  *
  9  */
 10 public interface AbstractFile {
 11     /**
 12      * 殺毒
 13      */
 14     void killVirus();
 15 }
 16 
 17 /**
 18  * 對圖片文件進行殺毒
 19  * @author CL
 20  *
 21  */
 22 class ImageFile implements AbstractFile {
 23     private String name;
 24 
 25     public ImageFile(String name) {
 26         this.name = name;
 27     }
 28 
 29     @Override
 30     public void killVirus() {
 31         System.out.println("-->對圖像文件\""+name+"\"進行查殺!");
 32     }
 33     
 34 }
 35 
 36 /**
 37  * 對文本文件進行殺毒
 38  * @author CL
 39  *
 40  */
 41 class TxtFile implements AbstractFile {
 42     private String name;
 43 
 44     public TxtFile(String name) {
 45         this.name = name;
 46     }
 47 
 48     @Override
 49     public void killVirus() {
 50         System.out.println("-->對文本文件\""+name+"\"進行查殺!");
 51     }
 52     
 53 }
 54 
 55 /**
 56  * 對視頻文件進行殺毒
 57  * @author CL
 58  *
 59  */
 60 class VideoFile implements AbstractFile {
 61     private String name;
 62 
 63     public VideoFile(String name) {
 64         this.name = name;
 65     }
 66 
 67     @Override
 68     public void killVirus() {
 69         System.out.println("-->對視頻文件\""+name+"\"進行查殺!");
 70     }
 71     
 72 }
 73 
 74 /**
 75  * 容器組件
 76  * @author CL
 77  *
 78  */
 79 class Folder implements AbstractFile {
 80     private String name;
 81     //容器:用來存放容器構建下的子節點
 82     private List<AbstractFile> list;
 83     
 84     public Folder() {
 85         list = new ArrayList<AbstractFile>();
 86     }
 87     
 88     public Folder(String name) {
 89         this();
 90         this.name = name;
 91     }
 92 
 93     public void add(AbstractFile file) {
 94         list.add(file);
 95     }
 96     
 97     public void remove(AbstractFile file) {
 98         list.remove(file);
 99     }
100     
101     public AbstractFile getChild(int index) {
102         return list.get(index);
103     }
104 
105     @Override
106     public void killVirus() {
107         System.out.println("-->文件夾\""+name+"\"進行查殺!");
108         
109         for (AbstractFile file : list) {
110             file.killVirus();    //遞歸
111         }
112     }
113     
114 }

  測試:架構設計

 1 /**
 2  * 使用組合模式模擬殺毒軟件
 3  * @author CL
 4  *
 5  */
 6 public class Client {
 7 
 8     public static void main(String[] args) {
 9         //1. 將圖片和文件加入到文件夾中,對文件夾進行查殺
10         Folder f1 = new Folder("個人文檔");
11         AbstractFile f2, f3, f4, f5;
12         
13         f2 = new ImageFile("xaau.jpg");
14         f3 = new TxtFile("Hello.java");
15         f1.add(f2);
16         f1.add(f3);
17         
18         f1.killVirus();
19         
20         System.out.println("-----------------------------------");
21         
22         //2.在文件夾中再加入一個文件夾,其中包含兩個視頻文件
23         Folder f11 = new Folder("電影");
24         f4 = new VideoFile("寶貝計劃.avi");
25         f5 = new VideoFile("泰囧.avi");
26         f11.add(f4);
27         f11.add(f5);
28         
29         f1.add(f11);
30         //對文件夾進行遞歸查殺
31         f1.killVirus();
32     }
33 }

  控制檯輸出:

-->文件夾"個人文檔"進行查殺!
-->對圖像文件"xaau.jpg"進行查殺!
-->對文本文件"Hello.java"進行查殺!
-----------------------------------
-->文件夾"個人文檔"進行查殺!
-->對圖像文件"xaau.jpg"進行查殺!
-->對文本文件"Hello.java"進行查殺!
-->文件夾"電影"進行查殺!
-->對視頻文件"寶貝計劃.avi"進行查殺!
-->對視頻文件"泰囧.avi"進行查殺!

4、組合模式經常使用開發應用場景

  (1)操做系統的資源管理器;

  (2)GUI的容器層次圖;

  (3)XML文件解析;

  (4)OA系統中,組織結構的處理;

  (5)Junit單元測試框架

      底層設計就是典型的組合模式,TestCase(葉子)、TestUnite(容器)、Test(抽象)

  (6)…………

相關文章
相關標籤/搜索