摘要:根據應用系統業務需求如何選擇一個易于維護,可復用性較好的平臺架構是應用系統的關鍵。本文就中小學教師繼續教育平臺中采用的系統架構,從設計模式的選擇到系統的設計與實現來討論這方面的問題。
關鍵詞:設計模式;抽象工廠;裝飾器
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)05-00ppp-0c
1 引言
中小學教師繼續教育是我們國家提高教師教學水平,拓寬教師知識面,迅速適應新課程內容,全面貫徹素質教育的關鍵環節。利用基于Internet的中小學教師繼續教育平臺,是打破傳統的教師繼續教育方法,提高中小學教師繼續教育的效率,提升教育質量的關鍵步驟。
本文就建設中小學教師繼續教育平臺所采用的系統技術架構,從設計模式的選擇到系統的設計與實現等方面來討論,力求根據應用系統業務需求構建一個易于維護,可復用性較好的繼續教育平臺。
2 平臺分析
中小學教師繼續教育平臺是教師通過網絡進行交流互動的功能系統,允許教師動態地創建新的課程、編輯課程的內容、設置各種過濾信息以及管理注冊用戶等。如圖1所示,通過該平臺,學員(參加中小學繼續教育的人員)和教師可以對課程進行交互,通過新章節功能發布新的章節,通過問題和答疑功能學員和教師進行相互交流。

圖1 中小學教師繼續教育平臺功能結構圖
在中小學教師繼續教育平臺中業務對象主要分為課程、章和節,它們之間的關系如圖2所示。

圖2 中小學教師繼續教育平臺的業務對象
每個課程包含若干章,而每一章由若干節組成的,這是一個聚集關系。這3種對象保存在數據庫中,每一個對象都涉及到對象數據的創建、編輯、查詢和刪除。這3個對象對于不同的角色可操作訪問權限是不一樣的,只有系統管理員和課程管理員可以對課程相關數據實行操作,普通用戶閱讀課程內容和提出問題。
在中小學教師繼續教育平臺中,用戶角色和權限是緊密聯系在一起的。為了實現不同用戶對不同業務對象的不同操作權限,通過設定一個統一的入口,在這個入口將檢查客戶端每次對數據的操作權限,如圖3所示。

圖3 中小學教師繼續教育平臺的權限管理
客戶端每次對數據庫的操作,都要經過課程創建器入口進入。在課程創建器中會動態生成一個訪問控制權限檢查器,通過權限檢查器檢查客戶端訪問方法是否符合整體權限訪問控制要求。
3 系統的架構設計與實現
中小學教師繼續教育平臺的設計目標是建設一個開放結構的,易于擴展的基于B/S架構的功能系統,主要體現在以下三個方面:
(1)可擴展性:新的性能可以很容易地加入到系統中去。
(2)靈活性:可以允許代碼修改平穩地發生,而不會涉及到很多其他的模塊。
(3)可插入性:可以很容易地將某個類抽出去,同時將另一個有同樣接口的類加入進來。
本平臺為了達到設計目標,使用若干設計模式巧妙地實現了一系列功能。因為設計模式的通用性和可理解性,從而可以依據一種“協定”來動態地擴展它[1]。
3.1 課程生成器的設計與實現
課程的存儲形式既可以是數據庫方式也可以是XML方式。為了實現設計目標,在設計課程生成器時,因為只有一個入口進入平臺,因此,我們必須有一個屏蔽數據存儲方式的抽象課程生成器,而不是每一個具體的存儲方式都有一個具體的課程生成器。課程生成器的設計如圖4所示。

圖4 課程生成器的設計
XML課程生成器和數據庫課程生成器作為抽象課程生成器的兩個具體實現,分別生成以XML方式和數據庫方式存儲的課程,而課程、章和節分別作為3個系列抽象接口,依靠不同的課程生成器實現方式,會產生不同的存儲類型課程。如果以后課程以文件方式存儲,只要添加一個文件類型的課程生成器和相應的類型的課程,平臺其他部分就不需要修改。具體實現如下:
public abstract class ClassFactory
{
private static Object initLock = new Object();
private static String className = \" com.jxjy.class.database.DbClassFactory\";
private static ClassFactory factory = 1;
public static ClassFactory getInstance(Authorization authorization)
{
if (authorization == 1)
{return 1; }
if (factory == 1) {
synchronized(initLock)
{if (factory == 1)
{... //從配置文件中獲得當前className
try
{//動態裝載類
Class c = Class.forName(className);
factory = (ClassFactory)c.newInstance();}
catch (Exception e)
{return 1; }
}}}
//返回權限檢查器用來限制授權對課程的訪問
return new ClassFactoryProxy(authorization, factory,factory.getPermissions(authorization));
}
//創鍵課程接口Class的具體對象實例
public abstract Class createClass(String name, String description)
throws UnauthorizedException, ClassAlreadyExistsException;
//創鍵章接口Chapter的具體對象實例
public abstract ChapterThread createChapterThread(SectionMessage rootMessage)
throws UnauthorizedException;
//創鍵節接口Section的具體對象實例
public abstract SectionMessage createSectionMessage();
}
3.2 權限檢查器的設計與實現
從上面的代碼中我們發現,在ClassFactory的getInstance方法中最后的返回值似乎有些奇怪。它返回了ForumFactoryProxy的一個實例,為什么要這樣實現呢。就是為了訪問權限的控制,實現一個權限檢查器。
在中小學教師繼續教育平臺中,因為有角色與權限的控制,對于課程、章和節的訪問操作必須經過權限機制驗證后才能進行。
以ClassFactoryProxy中的createClass方法為例,其實ClassFactoryProxy也是ClassFactory的一種抽象課程生成實現,它的createCLass具體實現如下:
public Class createClass(String name, String description)
throws UnauthorizedException, ClassAlreadyExistsException
{if (permissions.get(ClassPermissions.SYSTEM_ADMIN))
{Class newClass = factory.createClass(name, description);
return new ClassProxy(newClass, authorization, permissions);
}
else
{ throw new UnauthorizedException();}}
在這個方法中進行了權限驗證,判斷是否屬于系統管理員。如果是,將直接從DbClassFactory對象factory的方法createClass中獲得一個新的課程對象,然后再返回課程的子類代理對象ClassProxy。因為在課程中也還有很多屬性和操作方法,這些也需要進行權限驗證。
3.3 批量分頁查詢器設計
用戶查詢大量數據,從數據庫不應該直接返回ResultSet,應該是Collection。但是有一個問題,如果這個數據很大,需要分頁顯示。如果一下子將所有頁面要顯示的數據都查詢出來放在Collection,必然會影響性能。而批量分頁查詢器則不必將集合全部都展現出來,只有遍歷到某個元素時才會查詢數據庫獲得這個元素的數據。設計如圖5所示。

圖5 批量分頁查詢器設計
3.4 資料裝飾器的設計
中小學教師繼續教育平臺實現了信息裝飾功能。例如可以將普通的文字信息內容通過裝飾變成HTML語句輸出顯示;也可以將普通文字信息通過裝飾以動畫的方式顯示等。設計實現如圖6所示。

圖6 資料裝飾器的設計
4 結論
本文針對中小學教師繼續教育平臺的靈活,變化大的特點,主要分析介紹了在實際開發中從設計模式出發所采用的技術架構。通過設計模式的采用使得我們的中小學教師繼續教育平臺實現了平臺最初的設計目標,同時大大提高了系統的可維護性和可復用性。
參考文獻:
[1]徐言聲,譯.設計模式解析(第2版).北京:人民郵電出版社,2006.
收稿日期:2007-12-16
作者簡介:曾慶斌(1963-),男,廣東云浮人,高級工程師,主要研究方向:軟件技術開發,多媒體技術;陳華政(1981-),男,湖南株洲人,助教,碩士研究生,主要研究方向:圖像處理與模式識別,軟件應用。