樹形結構的處理——組合模式(三)
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)——樹形結構的處理設計模式
- 樹形結構處理
- 設計模式學習筆記(十三)組合模式及其在樹形結構中的應用設計模式筆記
- 樹形結構
- 組合模式-統一的處理個別物件與組合物件模式物件
- 8.結構型-組合模式模式
- LayUI—tree樹形結構的使用UI
- 設計模式(十四、十五)----結構型模式之組合模式設計模式
- 七、基本資料結構(樹形結構)資料結構
- markdown樹形結構生成工具
- Linux 下樹形結構的檢視Linux
- 資料結構中樹形結構簡介資料結構
- 【設計模式自習室】結構型:組合模式 Composite設計模式
- 梳理公司的組織架構 — 組合模式架構模式
- 樹形操作2-或、且關係組合
- 字串陣列轉為樹形結構字串陣列
- Android 多級樹形結構顯示Android
- GPU 架構是圖形處理器GPU架構
- SpringMVC(三)處理器方法形參繫結(繫結陣列、集合)、異常處理器、controller方法返回值SpringMVC陣列Controller
- 聊聊mysql的樹形結構儲存及查詢MySql
- 如何在 Laravel 中去構建部門樹形結構 APILaravelAPI
- 極簡架構模式-組合實體模式架構模式
- 將List物件列表轉為樹形結構物件
- Java將List集合組裝成樹(Tree)樹結構組裝Java
- Python影像處理丨三種實現影像形態學轉化運算模式Python模式
- 在vue專案中使用樹形結構的穿梭框Vue
- 值得了解的九種樹形資料結構 - Franco資料結構
- 樹形結構的選單表設計與查詢
- 溝槽的組合變形
- JAVA樹形結構 通用程式碼(高效能)Java
- 資料結構--線段樹合併資料結構
- 反轉連結串列、合併連結串列、樹的子結構
- js 統計樹形組織架構人員數量JS架構
- 字串處理,push pop路徑,組合命令字串
- 組合模式模式
- 樹形資料構造的方法
- iView元件庫之下拉框dropdown(樹形結構)View元件
- Vue遞迴元件實現樹形結構選單Vue遞迴元件
- 淺談樹形結構的特性和應用(上):多叉樹,紅黑樹,堆,Trie樹,B樹,B+樹...