11.3 完整解決方案
爲了讓系統具備更好的靈活性和可擴展性,客戶端能夠一致地對待文件和文件夾,Sunny公司開發人員使用組合模式來進行殺毒軟件的框架設計,其基本結構如圖11-5所示:html
圖11-5 殺毒軟件框架設計結構圖java
在圖11-5中, AbstractFile充當抽象構件類,Folder充當容器構件類,ImageFile、TextFile和VideoFile充當葉子構件類。完整代碼以下所示:編程
-
-
-
-
abstract class AbstractFile {
-
public abstract void add(AbstractFile file);
-
public abstract void remove(AbstractFile file);
-
public abstract AbstractFile getChild(int i);
-
public abstract void killVirus();
-
-
-
-
class ImageFile extends AbstractFile {
-
-
-
public ImageFile(String name) {
-
-
-
-
public void add(AbstractFile file) {
-
System.out.println(
"對不起,不支持該方法!");
-
-
-
public void remove(AbstractFile file) {
-
System.out.println(
"對不起,不支持該方法!");
-
-
-
public AbstractFile getChild(int i) {
-
System.out.println(
"對不起,不支持該方法!");
-
-
-
-
public void killVirus() {
-
-
System.out.println(
"----對圖像文件'" + name + "'進行殺毒");
-
-
-
-
-
class TextFile extends AbstractFile {
-
-
-
public TextFile(String name) {
-
-
-
-
public void add(AbstractFile file) {
-
System.out.println(
"對不起,不支持該方法!");
-
-
-
public void remove(AbstractFile file) {
-
System.out.println(
"對不起,不支持該方法!");
-
-
-
public AbstractFile getChild(int i) {
-
System.out.println(
"對不起,不支持該方法!");
-
-
-
-
public void killVirus() {
-
-
System.out.println(
"----對文本文件'" + name + "'進行殺毒");
-
-
-
-
-
class VideoFile extends AbstractFile {
-
-
-
public VideoFile(String name) {
-
-
-
-
public void add(AbstractFile file) {
-
System.out.println(
"對不起,不支持該方法!");
-
-
-
public void remove(AbstractFile file) {
-
System.out.println(
"對不起,不支持該方法!");
-
-
-
public AbstractFile getChild(int i) {
-
System.out.println(
"對不起,不支持該方法!");
-
-
-
-
public void killVirus() {
-
-
System.out.println(
"----對視頻文件'" + name + "'進行殺毒");
-
-
-
-
-
class Folder extends AbstractFile {
-
-
private ArrayList<AbstractFile> fileList=new ArrayList<AbstractFile>();
-
-
-
public Folder(String name) {
-
-
-
-
public void add(AbstractFile file) {
-
-
-
-
public void remove(AbstractFile file) {
-
-
-
-
public AbstractFile getChild(int i) {
-
return (AbstractFile)fileList.get(i);
-
-
-
public void killVirus() {
-
System.out.println(
"****對文件夾'" + name + "'進行殺毒");
-
-
-
for(Object obj : fileList) {
-
((AbstractFile)obj).killVirus();
-
-
-
編寫以下客戶端測試代碼:
-
-
public static void main(String args[]) {
-
-
AbstractFile file1,file2,file3,file4,file5,folder1,folder2,folder3,folder4;
-
-
folder1 =
new Folder("Sunny的資料");
-
folder2 =
new Folder("圖像文件");
-
folder3 =
new Folder("文本文件");
-
folder4 =
new Folder("視頻文件");
-
-
file1 =
new ImageFile("小龍女.jpg");
-
file2 =
new ImageFile("張無忌.gif");
-
file3 =
new TextFile("九陰真經.txt");
-
file4 =
new TextFile("葵花寶典.doc");
-
file5 =
new VideoFile("笑傲江湖.rmvb");
-
-
-
-
-
-
-
-
-
-
-
-
-
-
編譯並運行程序,輸出結果以下:框架
****對文件夾'Sunny的資料'進行殺毒ide ****對文件夾'圖像文件'進行殺毒post ----對圖像文件'小龍女.jpg'進行殺毒測試 ----對圖像文件'張無忌.gif'進行殺毒flex ****對文件夾'文本文件'進行殺毒this ----對文本文件'九陰真經.txt'進行殺毒spa ----對文本文件'葵花寶典.doc'進行殺毒 ****對文件夾'視頻文件'進行殺毒 ----對視頻文件'笑傲江湖.rmvb'進行殺毒 |
因爲在本實例中使用了組合模式,在抽象構件類中聲明瞭全部方法,包括用於管理和訪問子構件的方法,如add()方法和remove()方法等,所以在ImageFile等葉子構件類中實現這些方法時必須進行相應的異常處理或錯誤提示。在容器構件類Folder的killVirus()方法中將遞歸調用其成員對象的killVirus()方法,從而實現對整個樹形結構的遍歷。
若是須要更換操做節點,例如只需對文件夾「文本文件」進行殺毒,客戶端代碼只需修改一行便可,將代碼:
改成:
輸出結果以下:
****對文件夾'文本文件'進行殺毒 ----對文本文件'九陰真經.txt'進行殺毒 ----對文本文件'葵花寶典.doc'進行殺毒 |
在具體實現時,咱們能夠建立圖形化界面讓用戶選擇所需操做的根節點,無須修改源代碼,符合「開閉原則」,客戶端無須關心節點的層次結構,能夠對所選節點進行統一處理,提升系統的靈活性。
【做者:劉偉 http://blog.csdn.net/lovelion】