設計模式練習(8)——組合模式

組合模式

一、題目:

使用組合模式,設計一個殺毒軟件(AntiVirus)的框架,該軟件既可以對某個文件夾Folder殺毒,也可以對某個指定的文件殺毒,文件種類包括,文本文檔TextFile,圖片文件ImageFile,視頻文件VideoFile,繪製類圖並編程模擬實現。
(1)繪製組合模式結構視圖
(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<Gj19AbstractFile> fileList=new ArrayList<Gj19AbstractFile>();  
    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();  
    }  
}

五、運行結果:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章