系統(tǒng)需求
在一個CMS系統(tǒng)中,用戶User可以通過接口IDocService向系統(tǒng)添加,刪除,更新各種文章Doc,現(xiàn)要求設(shè)計IDocService的一個實現(xiàn)類,這個類除了能完成接口指定的功能外,還要能實現(xiàn)權(quán)限控制。
具體來說權(quán)限控制就是:用戶User擁有一個privilegePoint的屬性,它代表著用戶的權(quán)限大小,當(dāng)此值大于20時用戶能添加文章,大于40時能更新文章,大于60時能刪除文章。
需要實現(xiàn)的IDocService接口如下:
package com.heyang.traditonal.service;

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


/** *//**
* DocService需要實現(xiàn)的接口
* @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);
}
權(quán)力限制的基本結(jié)構(gòu):
對于這種簡單權(quán)限處理當(dāng)然不難,在執(zhí)行的方法中取得用戶權(quán)限再看它是否高于指定的權(quán)限即可,大于則執(zhí)行處理,小于等于則不予執(zhí)行。程序的基本結(jié)構(gòu)如下:

public void XXAction(Doc doc, User user)
{

if(user.getPrivilegePoint()>執(zhí)行XXAction需要的權(quán)限值)
{
// 執(zhí)行處理
}

else
{
// 權(quán)限不夠
}
}
基本方法確定了,接口指定的三個函數(shù)也能很快寫就。考慮到將需要的權(quán)限值硬編碼在程序中不方便修改維護,特地使用Spring的IoC,在生成DocService示例時從配置文件中取出值注入進入。下面是最終實現(xiàn)IDocService實現(xiàn)類及其Spring配置文件:
IDocService實現(xiàn)類:
package com.heyang.traditonal.service;

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


/** *//**
* 為領(lǐng)域?qū)ο驞oc提供服務(wù)
* @author 何楊(heyang78@gmail.com)
*
* @since 2008-12-30 下午05:13:29
* @version 1.00
*/

public class DocService implements IDocService
{
// 添加doc需要的權(quán)限點
private int addDocPrivilegePoint;
// 刪除doc需要的權(quán)限點
private int deleteDocPrivilegePoint;
// 更新doc需要的權(quán)限點
private int updateDocPrivilegePoint;

public void add(Doc doc, User user)
{

if(user.getPrivilegePoint()>addDocPrivilegePoint)
{
System.out.println("將"+doc+"交由dao處理(存入數(shù)據(jù)庫)");
}

else
{
System.out.println("用戶權(quán)限必須達到"+addDocPrivilegePoint+"才能執(zhí)行添加操作");
}
}


public void delete(Doc doc, User user)
{

if(user.getPrivilegePoint()>deleteDocPrivilegePoint)
{
System.out.println("將"+doc+"交由dao處理(從數(shù)據(jù)庫刪除)");
}

else
{
System.out.println("用戶權(quán)限必須達到"+deleteDocPrivilegePoint+"才能執(zhí)行刪除操作");
}
}


public void update(Doc doc, User user)
{

if(user.getPrivilegePoint()>updateDocPrivilegePoint)
{
System.out.println("將"+doc+"交由dao處理(更新數(shù)據(jù)庫中對應(yīng)的記錄)");
}

else
{
System.out.println("用戶權(quán)限必須達到"+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>
業(yè)務(wù)處理模擬過程,其中用戶權(quán)限只有50,能添加(>20)和修改文章(>40),不能刪除文章(>60):
ApplicationContext ctx = new ClassPathXmlApplicationContext("traditonalCtx.xml");

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

Doc doc=new Doc("論美國次貸危機的產(chǎn)生及影響");
User user=new User("中科院經(jīng)濟所研究員",50);

// 用戶向系統(tǒng)添加文章
docService.add(doc, user);

// 用戶向系統(tǒng)更新文章
doc.setName("論美國次貸危機的產(chǎn)生及影響和我國應(yīng)該采取的應(yīng)對措施");
docService.update(doc, user);

// 用戶從系統(tǒng)撒刪除文章
docService.delete(doc, user);

模擬過程的
輸出:
將文件 名=論美國次貸危機的產(chǎn)生及影響交由dao處理(存入數(shù)據(jù)庫)
將文件 名=論美國次貸危機的產(chǎn)生及影響和我國應(yīng)該采取的應(yīng)對措施交由dao處理(更新數(shù)據(jù)庫中對應(yīng)的記錄)
用戶權(quán)限必須達到60才能執(zhí)行刪除操作
小結(jié):
至此,權(quán)限子系統(tǒng)設(shè)計完成。在這個子系統(tǒng)中使用接口分離了接口和具體實現(xiàn),使用Spring的IoC消除了硬編碼,最后,使用Spring來調(diào)配系統(tǒng)中使用到的各種bean。這三種做法是降低系統(tǒng)耦合度,提高程序可讀性和可維護的常見措施,這些常見編程手法在編程中多加使用對整個程序?qū)⒋笥旭砸妗?
例程下載:
http://www.tkk7.com/Files/heyang/AOPPrivilegeSample20090102104233.rar
需要自行載入的包為:
commons-logging-1.0.4.jar,log4j-1.2.14.jar,spring.jar