組合模式
一、題目:
使用組合模式,設計一個殺毒軟件(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();
}
}
五、運行結果: