1. 程式人生 > >GOF23設計模式之組合模式(composite)

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

ret blog 構建 樹狀結構 遍歷 合成 str 管理 rri

一、組合模式概述

  將對象組合成樹狀結構以表示“部分和整體”層次結構,使得客戶可以統一的調用葉子對象和容器對象。

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

     把部分和整體的關系用樹形結構來表示,從而使客戶端可以使用統一的方式處理部分對象和整體對象。

  (2)組合模式核心

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

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

     容器(Composite)構件角色:有容器特征,可以包含子節點

 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 }

二、組合模式工作流程分析

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

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

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

  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"進行查殺!

四、組合模式常用開發應用場景

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

  (2)GUI的容器層次圖;

  (3)XML文件解析;

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

  (5)Junit單元測試框架

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

  (6)…………

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