系统需求
在一个CMS系统中,用户User可以通过接口IDocService向系统添加,删除,更新各种文章Doc,现要求设计IDocService的一个实现类,这个类除了能完成接口指定的功能外,还要能实现权限控制。
具体来说权限控制就是:用户User拥有一个privilegePoint的属性,它代表着用户的权限大小,当此值大于20时用户能添加文章,大于40时能更新文章,大于60时能删除文章。
需要实现的IDocService接口如下:
package com.heyang.traditonal.service;

import com.heyang.traditonal.domain.Doc;
import com.heyang.traditonal.domain.User;


/** *//**
* DocService需要实现的接口
* @author 何杨(heyang78@gmail.com)
*
* @since 2008-12-30 下午05:16:17
* @version 1.00
*/

public interface IDocService
{

/** *//**
* 用户user添加一个文档doc
* @param doc
* @param user
*/
public void add(Doc doc,User user);

/** *//**
* 用户user删除一个文档doc
* @param doc
* @param user
*/
public void delete(Doc doc,User user);

/** *//**
* 用户user更新一个文档doc
* @param doc
* @param user
*/
public void update(Doc doc,User user);
}
权力限制的基本结构:
对于这种简单权限处理当然不难,在执行的方法中取得用户权限再看它是否高于指定的权限即可,大于则执行处理,小于等于则不予执行。程序的基本结构如下:

public void XXAction(Doc doc, User user)
{

if(user.getPrivilegePoint()>执行XXAction需要的权限值)
{
// 执行处理
}

else
{
// 权限不够
}
}
基本方法确定了,接口指定的三个函数也能很快写就。考虑到将需要的权限值硬编码在程序中不方便修改维护,特地使用Spring的IoC,在生成DocService示例时从配置文件中取出值注入进入。下面是最终实现IDocService实现类及其Spring配置文件:
IDocService实现类:
package com.heyang.traditonal.service;

import com.heyang.traditonal.domain.Doc;
import com.heyang.traditonal.domain.User;


/** *//**
* 为领域对象Doc提供服务
* @author 何杨(heyang78@gmail.com)
*
* @since 2008-12-30 下午05:13:29
* @version 1.00
*/

public class DocService implements IDocService
{
// 添加doc需要的权限点
private int addDocPrivilegePoint;
// 删除doc需要的权限点
private int deleteDocPrivilegePoint;
// 更新doc需要的权限点
private int updateDocPrivilegePoint;

public void add(Doc doc, User user)
{

if(user.getPrivilegePoint()>addDocPrivilegePoint)
{
System.out.println("将"+doc+"交由dao处理(存入数据库)");
}

else
{
System.out.println("用户权限必须达到"+addDocPrivilegePoint+"才能执行添加操作");
}
}


public void delete(Doc doc, User user)
{

if(user.getPrivilegePoint()>deleteDocPrivilegePoint)
{
System.out.println("将"+doc+"交由dao处理(从数据库删除)");
}

else
{
System.out.println("用户权限必须达到"+deleteDocPrivilegePoint+"才能执行删除操作");
}
}


public void update(Doc doc, User user)
{

if(user.getPrivilegePoint()>updateDocPrivilegePoint)
{
System.out.println("将"+doc+"交由dao处理(更新数据库中对应的记录)");
}

else
{
System.out.println("用户权限必须达到"+updateDocPrivilegePoint+"才能更新添加操作");
}
}


public int getAddDocPrivilegePoint()
{
return addDocPrivilegePoint;
}


public void setAddDocPrivilegePoint(int addDocPrivilegePoint)
{
this.addDocPrivilegePoint = addDocPrivilegePoint;
}


public int getDeleteDocPrivilegePoint()
{
return deleteDocPrivilegePoint;
}


public void setDeleteDocPrivilegePoint(int deleteDocPrivilegePoint)
{
this.deleteDocPrivilegePoint = deleteDocPrivilegePoint;
}


public int getUpdateDocPrivilegePoint()
{
return updateDocPrivilegePoint;
}


public void setUpdateDocPrivilegePoint(int updateDocPrivilegePoint)
{
this.updateDocPrivilegePoint = updateDocPrivilegePoint;
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="docService" class="com.heyang.traditonal.service.DocService">
<property name="addDocPrivilegePoint" value="20" />
<property name="updateDocPrivilegePoint" value="40" />
<property name="deleteDocPrivilegePoint" value="60" />
</bean>
</beans>
业务处理模拟过程,其中用户权限只有50,能添加(>20)和修改文章(>40),不能删除文章(>60):
ApplicationContext ctx = new ClassPathXmlApplicationContext("traditonalCtx.xml");

IDocService docService=(IDocService)ctx.getBean("docService");

Doc doc=new Doc("论美国次贷危机的产生及影响");
User user=new User("中科院经济所研究员",50);

// 用户向系统添加文章
docService.add(doc, user);

// 用户向系统更新文章
doc.setName("论美国次贷危机的产生及影响和我国应该采取的应对措施");
docService.update(doc, user);

// 用户从系统撒删除文章
docService.delete(doc, user);

模拟过程的
输出:
将文件 名=论美国次贷危机的产生及影响交由dao处理(存入数据库)
将文件 名=论美国次贷危机的产生及影响和我国应该采取的应对措施交由dao处理(更新数据库中对应的记录)
用户权限必须达到60才能执行删除操作
小结:
至此,权限子系统设计完成。在这个子系统中使用接口分离了接口和具体实现,使用Spring的IoC消除了硬编码,最后,使用Spring来调配系统中使用到的各种bean。这三种做法是降低系统耦合度,提高程序可读性和可维护的常见措施,这些常见编程手法在编程中多加使用对整个程序将大有裨益。
例程下载:
http://www.blogjava.net/Files/heyang/AOPPrivilegeSample20090102104233.rar
需要自行载入的包为:
commons-logging-1.0.4.jar,log4j-1.2.14.jar,spring.jar