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