jive中的开发模式学习
博客专区 > sanmaoo 的博客 > 博客详情
jive中的开发模式学习
sanmaoo 发表于3年前
jive中的开发模式学习
  • 发表于 3年前
  • 阅读 16
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 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论坛的源码还是很有帮助的。

共有 人打赏支持
粉丝 0
博文 3
码字总数 1287
×
sanmaoo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: