GOF23設計模式之組合模式(composite)
阿新 • • 發佈:2018-01-22
ret blog 構建 樹狀結構 遍歷 合成 str 管理 rri
一、組合模式概述
將對象組合成樹狀結構以表示“部分和整體”層次結構,使得客戶可以統一的調用葉子對象和容器對象。
(1)組合模式的使用場景
把部分和整體的關系用樹形結構來表示,從而使客戶端可以使用統一的方式處理部分對象和整體對象。
(2)組合模式核心
抽象構件(Component)角色:定義了葉子和容器構件的共同點
葉子(Leaf)構件角色:無子節點
容器(Composite)構件角色:有容器特征,可以包含子節點
1 /** 2 * 抽象組件 3 * @author CL 4 * 5 */ 6 public interfaceComponent { 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(intindex); 27 }
二、組合模式工作流程分析
(1)組合模式為處理樹形結構提供了完美的解決方案,描述了如何將容器和葉子進行遞歸組合,使得用戶在使用時可以一致性的對待容器和葉子。
(2)當容器對象的指定方法被調用時,將遍歷整個樹形結構,尋找也包含這個方法的成員,並調用執行。其中,使用了遞歸調用的機制對整個結構進行處理。
三、使用組合模式模擬殺毒軟件架構設計
1 import java.util.ArrayList; 2 import java.util.List; 3 4 /** 5 * 模擬殺毒軟軟件架構設計 6 * 抽象組件 7 * @authorCL 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)