文档章节

jive中的开发模式学习

sanmaoo
 sanmaoo
发布于 2015/02/15 15:48
字数 700
阅读 25
收藏 0
点赞 0
评论 0

先来一张图,jive的统一入口:

客户端请求统一经过forumFactory类来处理,然后通过代理来完成各种操作。

先来分析ForumFactory类,其代码如下

public static ForumFactory getInstance(Authorization authorization) {
        //If no valid authorization passed in, return null.
        if (authorization == null) {
            return null;
        }
        if (factory == null) {
            synchronized(initLock) {
                if (factory == null) {
                    // Note, the software license expressely forbids
                    // tampering with this check.
                    //LicenseManager.validateLicense("Jive Forums Basic", "2.0");

                    String classNameProp =
                        JiveGlobals.getJiveProperty("ForumFactory.className");
                    if (classNameProp != null) {
                        className = classNameProp;
                    }
                    try {
                        //Load the class and create an instance.
                        Class c = Class.forName(className);
                        factory = (ForumFactory)c.newInstance();
                    }
                    catch (Exception e) {
                        System.err.println("Failed to load ForumFactory class "
                            + className + ". Jive cannot function normally.");
                        e.printStackTrace();
                        return null;
                    }
                }
            }
        }
        //Now, create a forum factory proxy.
        return new ForumFactoryProxy(authorization, factory,
                factory.getPermissions(authorization));
    }

首先分析这里的单例模式,单例模式主要特点就是某个类全局只有一个对象,基本思路是私有化构造函数,定义一个静态对象,再写一个静态的公共方法初始化这个对象然后返回;或者如这里直接在构造函数中返回静态对象。这里需要注意的是多线程的问题,jive的处理是check-lock-check,关于这里的处理有兴趣深入了解的可以看这一篇文章http://lifethinker.iteye.com/blog/260515

然后是这里的抽象工厂模式,可以看到FourmFactory只提供了一些论坛对象操作的接口,其初始化实现子类是private static String className = "com.jivesoftware.forum.database.DbForumFactory" ,也可以在配置文件中进行配置,这样的方式使得扩展非常方便。

String classNameProp =
                        JiveGlobals.getJiveProperty("ForumFactory.className");


代理模式,代理模式的思路是一个接口两个实现类,其中一个实现类为具体实现类,另一个实现类在实现接口时调用另一个类的实现,同时添加一些额外操作。这个模式jive论坛中主要用于权限控制,如ForumFactory的两个子类DbForumFactory和ForumFactoryProxy,接口Forum和其两个实现ForumProxy、DbForumProxy。

最后以一个请求的例子来说明一个各个模式的工作:创建一个论坛的过程

jive中只有超级管理员才能创建论坛,首先,jsp上会用ForumFactoryProxy类的factory对象调用其createForum方法,由于ForumFactoryProxy是DbForumFactory的代理,所以实际上调用的是DbForumFactory的createForum方法,这里进行了权限检查,

public Forum createForum(String name, String description)
            throws UnauthorizedException, ForumAlreadyExistsException
    {
        if (permissions.get(ForumPermissions.SYSTEM_ADMIN)) {
            Forum newForum = factory.createForum(name, description);
            return new ForumProxy(newForum, authorization, permissions);
        }
        else {
            throw new UnauthorizedException();
        }
    }

DbForumFactory的createForum方法调用DbForum的构造方法完成Forum的初始化。在返回的时候再次调用ForumProxy进行授权。

jive中还有其他模式的运用,比如迭代模式,装饰者模式等,过完年继续,阅读jive论坛的源码还是很有帮助的。

© 著作权归作者所有

共有 人打赏支持
sanmaoo
粉丝 0
博文 3
码字总数 1287
作品 0
西安
程序员
成为Java高手的重要过程

要想学好Java,首先要知道Java的大致分类。我们知道,自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Ne...

wersdffg ⋅ 2015/07/29 ⋅ 0

一个JAVA 程序员的告白

如何何迅速成为Java高手[Tomjava原创] 很多网友问我学习Java有没有什么捷径,我说“无他,唯手熟尔”。但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛...

JAVA_NINA ⋅ 2011/06/25 ⋅ 0

[转]如何迅速成为Java高手

如何迅速成为Java高手 来源:enet论坛 很多网友问我学习Java有没有什么捷径,我说“无他,唯手熟尔”。但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛...

Eagleguo998 ⋅ 2010/07/20 ⋅ 1

如何学好J2EE

该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你 都熟悉了吗?然后再从JSP学起。如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP...

精华之王 ⋅ 2009/04/11 ⋅ 0

Java代理模式(Proxy模式)

理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣。 Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个...

开源oschina ⋅ 2015/02/25 ⋅ 0

工厂模式深入学习【一】——定义和原理

工厂模式定义(为何而来) 我们以类Sample为例, 如果我们要创建Sample的实例对象: Sample* sample=new Sample(); 可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋...

chuichou ⋅ 2014/03/27 ⋅ 0

XMPP学习笔记-LESSON-007:XMPPServer.java之Plugin开发

网上关于openfire开发的文字非常多,在这里推荐一篇文章: http://redhacker.iteye.com/blog/1919329 openfire插件开发之完美开发 这是单独开发openfire插件的的一个实例。 不过我个人还是建议...

今幕明 ⋅ 2014/02/21 ⋅ 0

一种解读jive的方式。

了解设计模式不深,想从jive下手,不知道兄弟们分享下自己的经验,jive这套代码到底该如何下手,如何去读~ 欢迎大家来交流下啊。

漂泊的夜壶 ⋅ 2015/04/17 ⋅ 1

开源论坛系统--JiveJdon

JiveJdon 3是按照2004年国外最新设计思想"领域驱动设计"(Domain-Driven Design 简称DDD)、基于JdonFramework自主开发的论坛系统,基于原有 Jive 论坛的思路。JiveJdon 3.0设计特点: 先进建模...

匿名 ⋅ 2009/04/21 ⋅ 1

KPCB联合红杉资本3000万美元注资Jive软件

编者:Jive 是一个非常老牌的 Java 论坛软件,可惜现在不开源了。这种软件在国内几乎没市场,因为都被 Discuz 给占领了,而且外国人也很难理解为什么中国人的论坛上会有扔鸡蛋、送鲜花的功能...

红薯 ⋅ 2010/07/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

骰子游戏代码开源地址

因为阿里云现在服务器已经停用了,所以上面的配置已经失效。 服务端开源地址:https://gitee.com/goalya/chat4.git 客户端开源地址:https://gitee.com/goalya/client4.git 具体运行界面请参考...

算法之名 ⋅ 21分钟前 ⋅ 0

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部