zoukankan      html  css  js  c++  java
  • 树形结构的处理—组合模式(三)

    11.3  完整解决方案

          为了让系统具有更好的灵活性和可扩展性,客户端可以一致地对待文件和文件夹,Sunny公司开发人员使用组合模式来进行杀毒软件的框架设计,其基本结构如图11-5所示:

    11-5  杀毒软件框架设计结构图

        在图11-5中, AbstractFile充当抽象构件类,Folder充当容器构件类,ImageFileTextFileVideoFile充当叶子构件类。完整代码如下所示:

    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.  

          编写如下客户端测试代码:

    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的资料'进行杀毒

    ****对文件夹'图像文件'进行杀毒

    ----对图像文件'小龙女.jpg'进行杀毒

    ----对图像文件'张无忌.gif'进行杀毒

    ****对文件夹'文本文件'进行杀毒

    ----对文本文件'九阴真经.txt'进行杀毒

    ----对文本文件'葵花宝典.doc'进行杀毒

    ****对文件夹'视频文件'进行杀毒

    ----对视频文件'笑傲江湖.rmvb'进行杀毒

          由于在本实例中使用了组合模式,在抽象构件类中声明了所有方法,包括用于管理和访问子构件的方法,如add()方法和remove()方法等,因此在ImageFile等叶子构件类中实现这些方法时必须进行相应的异常处理或错误提示。在容器构件类FolderkillVirus()方法中将递归调用其成员对象的killVirus()方法,从而实现对整个树形结构的遍历。

          如果需要更换操作节点,例如只需对文件夹“文本文件”进行杀毒,客户端代码只需修改一行即可,将代码:

    folder1.killVirus();

           改为:

    folder3.killVirus();

           输出结果如下:

    ****对文件夹'文本文件'进行杀毒

    ----对文本文件'九阴真经.txt'进行杀毒

    ----对文本文件'葵花宝典.doc'进行杀毒

           在具体实现时,我们可以创建图形化界面让用户选择所需操作的根节点,无须修改源代码,符合“开闭原则”,客户端无须关心节点的层次结构,可以对所选节点进行统一处理,提高系统的灵活性。

    【作者:刘伟  http://blog.csdn.net/lovelion

  • 相关阅读:
    bzoj 2084: Antisymmetry 回文自动机
    bzoj 1819: 电子字典 Trie
    bzoj 1398: 寻找主人 AC自动机+最小表示法
    bzoj 4199: [Noi2015]品酒大会 后缀树
    bzoj 4044: Virus synthesis 回文自动机
    信用风险评分卡研究-第4章笔记
    信用风险评分卡研究-第3章笔记
    信用风险评分卡研究-第2章笔记
    信用风险评分卡研究-第1章笔记
    评分卡建模流程目录
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254786.html
Copyright © 2011-2022 走看看