樹形結構的處理—組合模式(三)

11.3  完整解決方案

      爲了讓系統具備更好的靈活性和可擴展性,客戶端能夠一致地對待文件和文件夾,Sunny公司開發人員使用組合模式來進行殺毒軟件的框架設計,其基本結構如圖11-5所示:java

11-5  殺毒軟件框架設計結構圖編程

    在圖11-5中, AbstractFile充當抽象構件類,Folder充當容器構件類,ImageFileTextFileVideoFile充當葉子構件類。完整代碼以下所示:框架

[java] view plain copy
  1. import java.util.*;  
  2.   
  3. //抽象文件類:抽象構件  
  4. abstract class AbstractFile  
  5.     public abstract void add(AbstractFile file);  
  6.     public abstract void remove(AbstractFile file);  
  7.     public abstract AbstractFile getChild(int i);  
  8.     public abstract void killVirus();  
  9.  
  10.   
  11. //圖像文件類:葉子構件  
  12. class ImageFile extends AbstractFile  
  13.     private String name;  
  14.       
  15.     public ImageFile(String name)  
  16.         this.name name;  
  17.      
  18.       
  19.     public void add(AbstractFile file)  
  20.        System.out.println("對不起,不支持該方法!");  
  21.      
  22.       
  23.     public void remove(AbstractFile file)  
  24.         System.out.println("對不起,不支持該方法!");  
  25.      
  26.       
  27.     public AbstractFile getChild(int i)  
  28.         System.out.println("對不起,不支持該方法!");  
  29.         return null 
  30.      
  31.       
  32.     public void killVirus()  
  33.         //模擬殺毒  
  34.         System.out.println("----對圖像文件'" name "'進行殺毒");  
  35.      
  36.  
  37.   
  38. //文本文件類:葉子構件  
  39. class TextFile extends AbstractFile  
  40.     private String name;  
  41.       
  42.     public TextFile(String name)  
  43.         this.name name;  
  44.      
  45.       
  46.     public void add(AbstractFile file)  
  47.        System.out.println("對不起,不支持該方法!");  
  48.      
  49.       
  50.     public void remove(AbstractFile file)  
  51.         System.out.println("對不起,不支持該方法!");  
  52.      
  53.       
  54.     public AbstractFile getChild(int i)  
  55.         System.out.println("對不起,不支持該方法!");  
  56.         return null 
  57.      
  58.       
  59.     public void killVirus()  
  60.         //模擬殺毒  
  61.         System.out.println("----對文本文件'" name "'進行殺毒");  
  62.      
  63.  
  64.   
  65. //視頻文件類:葉子構件  
  66. class VideoFile extends AbstractFile  
  67.     private String name;  
  68.       
  69.     public VideoFile(String name)  
  70.         this.name name;  
  71.      
  72.       
  73.     public void add(AbstractFile file)  
  74.        System.out.println("對不起,不支持該方法!");  
  75.      
  76.       
  77.     public void remove(AbstractFile file)  
  78.         System.out.println("對不起,不支持該方法!");  
  79.      
  80.       
  81.     public AbstractFile getChild(int i)  
  82.         System.out.println("對不起,不支持該方法!");  
  83.         return null 
  84.      
  85.       
  86.     public void killVirus()  
  87.         //模擬殺毒  
  88.         System.out.println("----對視頻文件'" name "'進行殺毒");  
  89.      
  90.  
  91.   
  92. //文件夾類:容器構件  
  93. class Folder extends AbstractFile  
  94.     //定義集合fileList,用於存儲AbstractFile類型的成員  
  95.     private ArrayList fileList=new ArrayList();  
  96.     private String name;  
  97.           
  98.     public Folder(String name)  
  99.         this.name name;  
  100.      
  101.       
  102.     public void add(AbstractFile file)  
  103.        fileList.add(file);    
  104.      
  105.       
  106.     public void remove(AbstractFile file)  
  107.         fileList.remove(file);  
  108.      
  109.       
  110.     public AbstractFile getChild(int i)  
  111.         return (AbstractFile)fileList.get(i);  
  112.      
  113.       
  114.     public void killVirus()  
  115.         System.out.println("****對文件夾'" name "'進行殺毒");  //模擬殺毒  
  116.           
  117.         //遞歸調用成員構件的killVirus()方法  
  118.         for(Object obj fileList)  
  119.             ((AbstractFile)obj).killVirus();  
  120.          
  121.      
  122.  

      編寫以下客戶端測試代碼:ide

[java] view plain copy
  1. class Client  
  2.     public static void main(String args[])  
  3.         //針對抽象構件編程  
  4.         AbstractFile file1,file2,file3,file4,file5,folder1,folder2,folder3,folder4;  
  5.           
  6.         folder1 new Folder("Sunny的資料");  
  7.         folder2 new Folder("圖像文件");  
  8.         folder3 new Folder("文本文件");  
  9.         folder4 new Folder("視頻文件");  
  10.           
  11.         file1 new ImageFile("小龍女.jpg");  
  12.         file2 new ImageFile("張無忌.gif");  
  13.         file3 new TextFile("九陰真經.txt");  
  14.         file4 new TextFile("葵花寶典.doc");  
  15.         file5 new VideoFile("笑傲江湖.rmvb");  
  16.   
  17.         folder2.add(file1);  
  18.         folder2.add(file2);  
  19.         folder3.add(file3);  
  20.         folder3.add(file4);  
  21.         folder4.add(file5);  
  22.         folder1.add(folder2);  
  23.         folder1.add(folder3);  
  24.         folder1.add(folder4);  
  25.           
  26.         //從「Sunny的資料」節點開始進行殺毒操做  
  27.         folder1.killVirus();  
  28.      
  29.  

      編譯並運行程序,輸出結果以下:測試

****對文件夾'Sunny的資料'進行殺毒this

****對文件夾'圖像文件'進行殺毒spa

----對圖像文件'小龍女.jpg'進行殺毒.net

----對圖像文件'張無忌.gif'進行殺毒設計

****對文件夾'文本文件'進行殺毒視頻

----對文本文件'九陰真經.txt'進行殺毒

----對文本文件'葵花寶典.doc'進行殺毒

****對文件夾'視頻文件'進行殺毒

----對視頻文件'笑傲江湖.rmvb'進行殺毒

      因爲在本實例中使用了組合模式,在抽象構件類中聲明瞭全部方法,包括用於管理和訪問子構件的方法,如add()方法和remove()方法等,所以在ImageFile等葉子構件類中實現這些方法時必須進行相應的異常處理或錯誤提示。在容器構件類FolderkillVirus()方法中將遞歸調用其成員對象的killVirus()方法,從而實現對整個樹形結構的遍歷。

      若是須要更換操做節點,例如只需對文件夾「文本文件」進行殺毒,客戶端代碼只需修改一行便可,將代碼:

folder1.killVirus();

       改成:

folder3.killVirus();

       輸出結果以下:

****對文件夾'文本文件'進行殺毒

----對文本文件'九陰真經.txt'進行殺毒

----對文本文件'葵花寶典.doc'進行殺毒

       在具體實現時,咱們能夠建立圖形化界面讓用戶選擇所需操做的根節點,無須修改源代碼,符合「開閉原則」,客戶端無須關心節點的層次結構,能夠對所選節點進行統一處理,提升系統的靈活性。

【做者:劉偉  http://blog.csdn.net/lovelion

相關文章
相關標籤/搜索