• 《阿古顿巴》藏语版在藏语卫视首播 2019-09-06
  • 晋中市“三同步”推动互联网治理创新 2019-08-27
  • 法媒:研究称美国人常用药物或增加抑郁风险 2019-08-27
  • 宝贝是地名,你能想到这么浪漫的地名在哪儿吗? 2019-08-15
  • 何树山副省长到方圆机电调研指导工作 2019-08-15
  • 河北快三号码推荐预测:Jive源代码研究

    来源:本网整理

    彩票双色球历史开奖结果 www.s9h6.com 前言 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方法来创建:

  • 本文相关:
  • Java: 尽可能使用堆栈变量
  • JAVA加密解密---自定义类加载器应用
  • 使用PreparedStatement减少开发时间
  • Java技术的新方向
  • Java编程中怎样实现中文排序
  • Guice与Spring框架的区别
  • Java异常处理的特殊情况
  • 对Java语言入门初学者的一些建议
  • Java基?。篔VM(Java 虚拟机)的详细讲解
  • 深入讨论JSF中Tree2组件使用方法
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 彩票双色球历史开奖结果 - 频道导航
    Copyright © 2017 彩票双色球历史开奖结果 www.s9h6.com All Rights Reserved
  • 《阿古顿巴》藏语版在藏语卫视首播 2019-09-06
  • 晋中市“三同步”推动互联网治理创新 2019-08-27
  • 法媒:研究称美国人常用药物或增加抑郁风险 2019-08-27
  • 宝贝是地名,你能想到这么浪漫的地名在哪儿吗? 2019-08-15
  • 何树山副省长到方圆机电调研指导工作 2019-08-15
  • 广东十一选五遗漏数据 cq9官网平台 河北快3号码统计表 七乐彩59期开奖视频 时时彩玩单双计划 青海快3和值走势图 年香港六合彩生肖 3d试机号历史上的今天 河北20选5五开奖结果 快乐赛车APP 注册就送68无需申请 重庆时时彩摇奖号码 足彩进球彩玩法 排球世锦赛2019直播间 3d开机号和试机号查询近十期