現在不少應用採用外掛程式系統,應用規定了若干介面,開發人員可以使用這些介面編寫外掛程式,然後嚮應用系統註冊外掛程式,從軟體設計的角度看,這就是可擴充項物件模型,此處外掛程式可以進行任意擴充,但使用外掛程式的應用系統卻保持不變,因此是片面的可擴充項物件模型。此處片面一詞並無貶義,只是根據需要來使用這種模型而已。
若這種可擴充模型中,連調用外掛程式的應用主體都進行了擴充,則可稱為全面可擴充項物件模型。
實現一個可擴充項物件模型是比較複雜的,涉及到模組功能的抽象思維和物件導向的編程思想,在此使用檔案系統的物件模型來示範一番。
首先進行軟體功能的抽象,檔案系統的功能主要有
1。檔案系統有檔案和目錄組成。每個檔案和目錄都用名稱。
2。目錄可以包含若干個子目錄和檔案,如此構成檔案樹狀列表。
3。目錄下可以新增和刪除子目錄或檔案,可以修改目錄名或檔案名稱。
4。可以獲得目錄的所有子目錄或檔案清單,目錄可以獲得指定名稱的子目錄或檔案。
5。檔案可以讀取或寫入位元據,獲得操作檔案的流對象。
此外還有若干其他功能。
很顯然,所有的檔案系統都應當實現上述的準系統,於是很容易設計出以下三個對象
XFileSystemBase 為檔案系統的主體對象,或者頂級對象,用於支援整個檔案系統模型的運行。
XDirectoryBase 抽象目錄對象。
XFileBase 抽象檔案對象。
這三個對象抽象定義了檔案系統的通用功能,並構造了檔案系統的物件模型,並實現了一些常式。
抽象檔案系統物件模型建立以後,我們首先針對作業系統的檔案系統進行擴充,主要使用了System.IO 名稱空間下的模組,對XFileSystemBase , XDirectoryBase 和 XFileBase 都進行了擴充。從而產生了三個新的類型 StdFileSystem , StdDirectory 和 StdFile 。
想必有人會問,直接使用System.IO 名稱空間不是很方便嗎,為何多此一舉?其實很多設計模式的使用,都是擴大了編寫代碼的初期投入,花了不少時間來構造物件模型,一旦模型建立起來,實作類別似功能的軟體模組就很容易了,而且避免代碼的拷貝和重複。從長遠看這是非常值得的。但設計模型需要使用合理,不要教條主義,根據當前需要和可預見的未來合理使用。
一些資訊系統需要建立類似這種檔案系統的功能,但是不是基於作業系統的標準檔案系統的,而是基於資料庫的。於是我們有從抽象檔案系統派生出基於資料庫的檔案系統模型,在此實現了三個類型 DBFileSystem , DBDirectory 和 DBFile 。其中DBFileSystem中使用一個標準的資料庫連接對象來獲得未經處理資料。DBDirectory 和 DBFile 調用DBFileSystem 提供的內部方法來獲得對象資料。
這樣一個應用系統中,若使用 XFileSystemBase 訪問檔案系統,則可以根據需要將 XFileSystem 對象指向到 StdFileSystem 或 DBFileSystem , 如此應用系統既可以訪問標準檔案系統,也可以訪問儲存在資料庫中的檔案系統,兩者可任意切換而不影響應用系統的其他功能。增強軟體的靈活性。
由於這個檔案系統是全面可擴充的,因此可以實現基於WebService , 基於 ftp 等等的檔案系統,而後應用系統就可以支援WebServer,FTP等的檔案系統模型了。
本人推出的XDesignerLib圖形設計器中介軟體中,花費了數萬行代碼用來構造可全面擴充的設計器文件物件模型,這種文件物件模型的擴充方式類似於這裡的抽象檔案系統,只是介面更加豐富而已。
這個抽象檔案系統聯想到虛擬技術,有時軟體虛擬硬體或其他軟體。比如虛擬光碟片軟體就根據儲存在硬碟中的光碟片鏡像檔案來虛擬一個光碟片。虛擬磁碟軟體則使用記憶體虛擬一個磁碟,可在頻繁讀寫磁碟檔案的時候可以倍增操作速度。微軟的作業系統的底層定義了通用的檔案系統介面,而應用軟體可以實現這個通用檔案系統介面來虛擬出各種光碟片和硬碟。
同理,此處首先定義了檔案系統的通用介面,然後StdFileSystem , DBFileSystem 通過實現這個通用介面來虛擬檔案系統。
此處提供 抽象檔案系統,標準檔案系統和資料庫檔案系統的原始碼和示範資料庫,該代碼未經嚴格測試。http://files.cnblogs.com/xdesigner/xfilesystem.rar .
袁永福 ( http://www.xdesigner.cn ) 2006-12-4