设计模式练习(8)——组合模式

组合模式

一、题目:

使用组合模式,设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹Folder杀毒,也可以对某个指定的文件杀毒,文件种类包括,文本文档TextFile,图片文件ImageFile,视频文件VideoFile,绘制类图并编程模拟实现。
(1)绘制组合模式结构视图
(2)给出实例类图并实现代码。

二、所用模式结构视图:

设计模式练习(8)——组合模式_第1张图片

三、实例类图:

设计模式练习(8)——组合模式_第2张图片

四、实例实现代码:

(因为区分,所以在类的前面加了Gj19)

抽象文件类:抽象构件

package CompositePattern;
/**
 * 抽象文件类:抽象构件 
 * @author gong
 *
 */

abstract class Gj19AbstractFile {  
  public abstract void add(Gj19AbstractFile file);  
  public abstract void remove(Gj19AbstractFile file);  
  public abstract Gj19AbstractFile getChild(int i);  
  public abstract void killVirus();  
}  

图像文件类:叶子构件

package CompositePattern;
/**
 * 图像文件类:叶子构件 
 * @author gong
 *
 */
public class Gj19ImageFile extends Gj19AbstractFile{

    private String name;  

    public Gj19ImageFile(String name) {  
        this.name = name;  
    }  
    @Override  
    public void add(Gj19AbstractFile file) {  
       System.out.println("错误,不支持该方法!");  
    }  
    @Override
    public void remove(Gj19AbstractFile file) {  
        System.out.println("错误,不支持该方法!");  
    }  

    public Gj19ImageFile getChild(int i) {  
        System.out.println("错误,不支持该方法!");  
        return null;  
    }  

    public void killVirus() {  
        //模拟杀毒  
        System.out.println("----对图像文件'" + name + "'进行杀毒");  
    }


}

文本文件类:叶子构件

package CompositePattern;
/**
 * 文本文件类:叶子构件 
 * @author gong
 *
 */
public class Gj19TextFile extends Gj19AbstractFile{

    private String name;  

    public Gj19TextFile(String name) {  
        this.name = name;  
    }  
    @Override  
    public void add(Gj19AbstractFile file) {  
       System.out.println("错误,不支持该方法!");  
    }  
    @Override
    public void remove(Gj19AbstractFile file) {  
        System.out.println("错误,不支持该方法!");  
    }  

    public Gj19TextFile getChild(int i) {  
        System.out.println("错误,不支持该方法!");  
        return null;  
    }  

    public void killVirus() {  
        //模拟杀毒  
        System.out.println("----对文本文件'" + name + "'进行杀毒");  
    }


}

视频文件类:叶子构件

package CompositePattern;
/**
 * 视频文件类:叶子构件 
 * @author gong
 *
 */
public class Gj19VideoFile extends Gj19AbstractFile{

    private String name;  

    public Gj19VideoFile(String name) {  
        this.name = name;  
    }  
    @Override  
    public void add(Gj19AbstractFile file) {  
       System.out.println("错误,不支持该方法!");  
    }  
    @Override
    public void remove(Gj19AbstractFile file) {  
        System.out.println("错误,不支持该方法!");  
    }  

    public Gj19VideoFile getChild(int i) {  
        System.out.println("错误,不支持该方法!");  
        return null;  
    }  

    public void killVirus() {  
        //模拟杀毒  
        System.out.println("----对视频文件'" + name + "'进行杀毒");  
    }


}

文件夹类:容器构件

package CompositePattern;

import java.util.ArrayList;
/**
 * 文件夹类:容器构件
 * @author gong
 *
 */
public class Gj19Folder extends Gj19AbstractFile{
    //定义集合fileList,用于存储AbstractFile类型的成员  
    private ArrayList fileList=new ArrayList();  
    private String name;  

    public Gj19Folder(String name) {  
        this.name = name;  
    }  

    public void add(Gj19AbstractFile file) {  
       fileList.add(file);    
    }  

    public void remove(Gj19AbstractFile file) {  
        fileList.remove(file);  
    }  

    public Gj19AbstractFile getChild(int i) {  
        return (Gj19AbstractFile)fileList.get(i);  
    }  

    public void killVirus() {  
        System.out.println("****对文件夹'" + name + "'进行杀毒");  //模拟杀毒  

        //递归调用成员构件的killVirus()方法  
        for(Object obj : fileList) {  
            ((Gj19AbstractFile)obj).killVirus();  
        }  
    }  
}

客户端测试类

package CompositePattern;

public class Gj19Client {
    public static void main(String args[]) {  
        //针对抽象构件编程  
        Gj19AbstractFile file1,file2,file3,file4,file5,folder1,folder2,folder3,folder4;  

        folder1 = new Gj19Folder("我的文件");  
        folder2 = new Gj19Folder("图像文件");  
        folder3 = new Gj19Folder("文本文件");  
        folder4 = new Gj19Folder("视频文件");  

        file1 = new Gj19ImageFile("阿拉蕾.jpg");  
        file2 = new Gj19ImageFile("安吉.gif");  
        file3 = new Gj19TextFile("饥荒.txt");  
        file4 = new Gj19TextFile("娇小.doc");  
        file5 = new Gj19VideoFile("可爱.rmvb");  

        folder2.add(file1);  
        folder2.add(file2);  
        folder3.add(file3);  
        folder3.add(file4);  
        folder4.add(file5);  
        folder1.add(folder2);  
        folder1.add(folder3);  
        folder1.add(folder4);  

        //从“我的文件”节点开始进行杀毒操作  
        folder1.killVirus();  
    }  
}

五、运行结果:

设计模式练习(8)——组合模式_第3张图片

你可能感兴趣的:(设计模式)