文档章节

jive中的开发模式学习

sanmaoo
 sanmaoo
发布于 2015/02/15 15:48
字数 700
阅读 30
收藏 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代理模式(Proxy模式)

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

开源oschina
2015/02/25
0
0
[转]如何迅速成为Java高手

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

Eagleguo998
2010/07/20
0
1
KPCB联合红杉资本3000万美元注资Jive软件

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

红薯
2010/07/22
936
0
【信息图表】企业的社会化商业进程

一张来自 GetSatisfaction的信息图,这次说的是社会化商业(social business)这件事。到2014年,为社会化商业提供的服务、软件和工具的市场规模会达到46亿美金。在之前的文章中也有提及这个...

小卒过河
2011/08/17
680
0
如何学好J2EE

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

精华之王
2009/04/11
602
0

没有更多内容

加载失败,请刷新页面

加载更多

webpack4 css打包、压缩、分离、去重等优化配置详解

Webpack 4 目前版本已经到了4.27 相较于前面的版本还是有一些改动的,具体可以参考升级指南 迁移到新版本 这里只介绍 css 的 打包、压缩、分离、去重 的方法; 不懂的或者有更优的方案,欢迎...

zerokb-小浪
16分钟前
0
0
基于协同过滤算法的推荐

基于协同过滤算法的推荐 (本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 数据挖掘的一个经典案例就是尿布与啤酒的例子。尿布与啤酒看似毫不相关的两种产品,但是当超市将两种产...

阿里云官方博客
24分钟前
1
0
Tomcat配置强制https端口变成8443的解决办法

Tomcat配置强制https端口变成8443的解决办法 2017年10月18日 10:44:10 我们始终是路人 阅读数:2953 标签: tomcathttps8443443 更多 个人分类: Tomcat 版权声明:本文为博主原创文章,未经...

linjin200
25分钟前
1
0
基于协同过滤算法的推荐

基于协同过滤算法的推荐 (本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 数据挖掘的一个经典案例就是尿布与啤酒的例子。尿布与啤酒看似毫不相关的两种产品,但是当超市将两种产...

阿里云云栖社区
27分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部