前言 Jive是一個開放的Java源代碼項目。其目標是建設一個開放結構的,強壯的,易於擴展的基於jsp的論壇。在其設計目標的指導下,其結構設計得非常得好,融合了很多新的觀念,比如Design Pattern,可更換的SKIN,可插入Plug等等。 <!-- frame contents -->
<!-- /frame contents --> 具體解讀其源代碼對於理解這些新的設計上的概念是很有裨益的。假如你對Design Pattern和Java語言有一定的了解,但是還是會時常迷惑於其中的話,不妨研究研究Jive源代碼,一定會對其中的很多概念有更深入的理解。這篇文章源於我的Jive源代碼研究筆記,希望能夠提綱挈領,帶領大家進入到這個美好的世界。當然,假如沒有時間仔細地看源代碼的話,看看這篇文章,我想也是會有一些幫助的。
再開始之前,需要指出的是,Jive中對Design Pattern的應用,並沒有拘禮與GOF書中所給出的實現方法,而是有許多變通的地方。一方面,我想是由於具體的實際需要,另一方面,我想這也是設計觀念進化的結果吧。因而,這些變通的地方,將是我講解的重點。整體結構概敘
基於一個OO的設計原則:面向接口編程,而不是針對實現編程。Jive在設計的時候,把其大部分的基本對象都設計為接口或者抽象類。在Jive中,基本的接口有Forum,ForumMessage,ForumThread,Group,User,Authorization和Query。我們可以很輕易的從這些接口的名字來知道他們的功用,下面的類圖給出了這些類之間的一些靜態關系:
圖1:Jive整體關系
你可能會有疑問,為什麼會都是接口呢?這是基於擴展性考慮的。在Jive給出的實現中,所有的這些接口,Forum,ForumMessage,User等等,都使用數據庫來實現的,一條消息,或者一個用戶對應於數據庫中的一條消息Jive使用了DbForum,DbForumMessage,DbUser等類來實現這些接口,通過JDBC來操作數據庫,使之作為論壇的底層支撐。
然而,有時候,或許我們並不想使用數據庫,比如我們想只是使用文件系統來作為論壇的底層支撐,這時候,我們需要做的只是編碼實現了Forum等等接口的諸如FileFroum,FileForumMessage等對象,然後嵌入Jive中即可,原有的任何代碼都可以不用改變!!!這就是面向接口編程的威力了!
下面來看看具體的設計和編碼。
AbstractFactory模式和可擴展性
假如要實現較好的可擴展性,AbstractFactory模式確實是一件利器。如上面所說,假如要創建的Forum接口的不同實現,而又不想更改代碼的話,就需要用到抽象工廠了。再Jive中,AuthorizationFactory類是一個抽象類,用來創建Authorization對象。這是一個抽象工廠,可以通過不同的子類來創建不同的Authorization對象。這個工廠的實現方法是:
在AuthorizationFactory中使用一個private static變量factory,用來引用具體的抽象工廠的實例:
private static AuthorizationFactory factory = null;
private static String className ="com.coolservlets.forum.database.DbAuthorizationFactory";
private static void loadAuthorizationFactory() {
if (factory == null) {
synchronized(className) {
if (factory == null) {
String classNameProp = PropertyManager.getProperty(
"AuthorizationFactory.className"
);
if (classNameProp != null) {
className = classNameProp;
}
try {
Class c = Class.forName(className);
factory = (AuthorizationFactory)c.newInstance();
}
catch (Exception e) {
System.err.println("Exception loading class: " + e);
e.printStackTrace();
}
}
}
}
}