WEB开发网
开发学院WEB开发Jsp Jive源代码研究 阅读

Jive源代码研究

 2008-01-05 20:31:59 来源:WEB开发网   
核心提示:前言Jive是一个开放的java源代码项目,其目标是建设一个开放结构的,Jive源代码研究,强壮的,易于扩展的基于jsp的论坛,来指明具体的抽象工厂的子类类名:private static String className ="com.coolservlets.forum.database.DbAuthori

前言 Jive是一个开放的java源代码项目。其目标是建设一个开放结构的,强壮的,易于扩展的基于jsp的论坛。在其设计目标的指导下,其结构设计得非常得好,融合了很多新的观念,比如Design Pattern,可更换的SKIN,可插入Plug等等。 具体解读其源代码对于理解这些新的设计上的概念是很有裨益的。假如你对Design Pattern和Java语言有一定的了解,但是还是会时常迷惑于其中的话,不妨研究研究Jive源代码,一定会对其中的很多概念有更深入的理解。这篇文章源于我的Jive源代码研究笔记,希望能够提纲挈领,带领大家进入到这个美好的世界。当然,假如没有时间仔细地看源代码的话,看看这篇文章,我想也是会有一些帮助的。

  再开始之前,需要指出的是,Jive中对Design Pattern的应用,并没有拘礼与GOF书中所给出的实现方法,而是有许多变通的地方。一方面,我想是由于具体的实际需要,另一方面,我想这也是设计观念进化的结果吧。因而,这些变通的地方,将是我讲解的重点。整体结构概叙
  基于一个OO的设计原则:面向接口编程,而不是针对实现编程。Jive在设计的时候,把其大部分的基本对象都设计为接口或者抽象类。在Jive中,基本的接口有Forum,ForumMessage,ForumThread,Group,User,Authorization和Query。我们可以很轻易的从这些接口的名字来知道他们的功用,下面的类图给出了这些类之间的一些静态关系:

Jive源代码研究

图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方法来创建:

Tags:Jive 源代码 研究

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接