樹形結構的處理——組合模式(三)
11.3 完整解決方案
為了讓系統具有更好的靈活性和可擴充套件性,客戶端可以一致地對待檔案和資料夾,Sunny公司開發人員使用組合模式來進行防毒軟體的框架設計,其基本結構如圖11-5所示:
圖11-5 防毒軟體框架設計結構圖
在圖11-5中, AbstractFile充當抽象構件類,Folder充當容器構件類,ImageFile、TextFile和VideoFile充當葉子構件類。完整程式碼如下所示:
import java.util.*;
//抽象檔案類:抽象構件
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 {
private String name;
public ImageFile(String name) {
this.name = 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("對不起,不支援該方法!");
return null;
}
public void killVirus() {
//模擬防毒
System.out.println("----對影象檔案'" + name + "'進行防毒");
}
}
//文字檔案類:葉子構件
class TextFile extends AbstractFile {
private String name;
public TextFile(String name) {
this.name = 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("對不起,不支援該方法!");
return null;
}
public void killVirus() {
//模擬防毒
System.out.println("----對文字檔案'" + name + "'進行防毒");
}
}
//視訊檔案類:葉子構件
class VideoFile extends AbstractFile {
private String name;
public VideoFile(String name) {
this.name = 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("對不起,不支援該方法!");
return null;
}
public void killVirus() {
//模擬防毒
System.out.println("----對視訊檔案'" + name + "'進行防毒");
}
}
//資料夾類:容器構件
class Folder extends AbstractFile {
//定義集合fileList,用於儲存AbstractFile型別的成員
private ArrayList<AbstractFile> fileList=new ArrayList<AbstractFile>();
private String name;
public Folder(String name) {
this.name = name;
}
public void add(AbstractFile file) {
fileList.add(file);
}
public void remove(AbstractFile file) {
fileList.remove(file);
}
public AbstractFile getChild(int i) {
return (AbstractFile)fileList.get(i);
}
public void killVirus() {
System.out.println("****對資料夾'" + name + "'進行防毒"); //模擬防毒
//遞迴呼叫成員構件的killVirus()方法
for(Object obj : fileList) {
((AbstractFile)obj).killVirus();
}
}
}
編寫如下客戶端測試程式碼:
class Client {
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");
folder2.add(file1);
folder2.add(file2);
folder3.add(file3);
folder3.add(file4);
folder4.add(file5);
folder1.add(folder2);
folder1.add(folder3);
folder1.add(folder4);
//從“Sunny的資料”節點開始進行防毒操作
folder1.killVirus();
}
}
編譯並執行程式,輸出結果如下:
****對資料夾'Sunny的資料'進行防毒 ****對資料夾'影象檔案'進行防毒 ----對影象檔案'小龍女.jpg'進行防毒 ----對影象檔案'張無忌.gif'進行防毒 ****對資料夾'文字檔案'進行防毒 ----對文字檔案'九陰真經.txt'進行防毒 ----對文字檔案'葵花寶典.doc'進行防毒 ****對資料夾'視訊檔案'進行防毒 ----對視訊檔案'笑傲江湖.rmvb'進行防毒 |
由於在本例項中使用了組合模式,在抽象構件類中宣告瞭所有方法,包括用於管理和訪問子構件的方法,如add()方法和remove()方法等,因此在ImageFile等葉子構件類中實現這些方法時必須進行相應的異常處理或錯誤提示。在容器構件類Folder的killVirus()方法中將遞迴呼叫其成員物件的killVirus()方法,從而實現對整個樹形結構的遍歷。
如果需要更換操作節點,例如只需對資料夾“文字檔案”進行防毒,客戶端程式碼只需修改一行即可,將程式碼:
folder1.killVirus(); |
改為:
folder3.killVirus(); |
輸出結果如下:
****對資料夾'文字檔案'進行防毒 ----對文字檔案'九陰真經.txt'進行防毒 ----對文字檔案'葵花寶典.doc'進行防毒 |
在具體實現時,我們可以建立圖形化介面讓使用者選擇所需操作的根節點,無須修改原始碼,符合“開閉原則”,客戶端無須關心節點的層次結構,可以對所選節點進行統一處理,提高系統的靈活性。
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 樹形結構的處理——組合模式(五)模式
- 樹形結構的處理——組合模式(四)模式
- 樹形結構的處理——組合模式(二)模式
- 樹形結構的處理——組合模式(一)模式
- 設計模式系列之組合模式(Composite Pattern)——樹形結構的處理設計模式
- 樹形結構處理
- 結構型之三-組合模式模式
- 設計模式學習筆記(十三)組合模式及其在樹形結構中的應用設計模式筆記
- 結構型-組合模式模式
- 組合模式-統一的處理個別物件與組合物件模式物件
- 淺談 JavaScript 處理樹形結構的幾個場景與方案JavaScript
- 樹形結構
- 8.結構型-組合模式模式
- Vue 結合 D3js 產生的樹形結構。VueJS
- layui樹形結構UI
- java樹形結構Java
- 設計模式--組合模式Composite(結構型)設計模式
- 設計模式(十四、十五)----結構型模式之組合模式設計模式
- LayUI—tree樹形結構的使用UI
- 七、基本資料結構(樹形結構)資料結構
- JAVA設計模式(10):結構型-組合模式(Composite)Java設計模式
- 梳理公司的組織架構 — 組合模式架構模式
- 梳理公司的組織架構 --- 組合模式架構模式
- markdown樹形結構生成工具
- php tree類的使用(樹形結構)PHP
- [Swing]樹形結構的實現
- 一個簡單的樹形結構
- 樹形結構資料儲存方案(三):閉包表
- 樹形操作2-或、且關係組合
- 資料結構中樹形結構簡介資料結構
- 【設計模式自習室】結構型:組合模式 Composite設計模式
- 樹形結構資料儲存方案(一):鄰接列表模式模式
- Linux 下樹形結構的檢視Linux
- 樹形結構的儲存與查詢
- Oracle 樹形結構查詢的特殊用法Oracle
- 使用遞迴演算法結合資料庫解析成java樹形結構遞迴演算法資料庫Java
- 這個處理器的組合語言:組合語言
- 極簡架構模式-組合實體模式架構模式