程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Jive源代碼研究

Jive源代碼研究

編輯:JAVA編程入門知識

  前言 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,來指明具體的抽象工廠的子類類名:
  

  private static String className ="com.coolservlets.forum.database.DbAuthorizationFactory";


  
  然後是用一個private static的loadAuthorizationFactory方法來給這個factory變量賦值,生成具體的抽象工廠類:
  

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();
  }
  }
  }
  }
  }


  
  在static的getAuthorization方法返回一個Authorization的過程中,先初始化工廠類factory變量,然後用factory的createAuthorization方法來創建:
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved