jive中的开发模式学习

先来一张图,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论坛的源码还是很有帮助的。

转载于:https://my.oschina.net/u/2304210/blog/378798

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值