Java设计模式之用户、角色和权限
一、定义
角色决定了用户有哪些权限
简单来说,就是通过给用户授权角色,用户就获得了属于该角色的权限。这样分配就不用分别创建不同的用户类,只需要给用户类赋予不同的角色属性就可以实现不同的用户。另外,这种模式使系统易于扩展和维护。比如当要给某一种用户增加新的权限时,只要给角色增加权限即可,不需要对若干用户对象一一操作。在实际开发中,遇到权限划分的问题,经常一般可以采用用户、角色、权限模式。
1. 权限
权限是操作,是针对行为的。一般把行为、能力抽象为接口,所以把权限也抽象为接口(interface)。注意接口类和接口实现类的对应。
2. 角色
角色类一般为抽象类(Role),角色类的属性有权限和角色描述,方法有一些get()/set()和权限的分配操作。
3. 用户
用户类可以普通类。拥有一个角色属性。
二、实例
星云书店系统的用户分为两类,即库管
和顾客
。
库管
的行为有:图书入库、图书出库、新增图书和查询图书
顾客
的行为有:查询图书、购买图书、购买附赠品和结账。
可设计出如下的接口类、角色类和用户类。
1. 权限接口类
(1) 顾客权限接口类
/*
* 顾客的权限
*/
public interface Normal {
public void query(); //查询图书
public Book buy(int bookid,int num);//购买图书
public EX buyEx(int exCode); //购买赠品
public void checkout(Book book); //结账
}
(2) 库管权限接口类
/*
* 管理员的权限
*/
public interface StoreMgr {
public void in(int bookid, int num);//图书入库
public void out(int bookid, int num);//图书出库
public void save(Book book);//新增图书
public void query();//查询库存
}
2. 权限的实现类
(1) 顾客权限实现类
BookBiz
是图书业务类
/*
* 普通顾客
* 接口实现
*/
public class DefaultCustomer implements Normal {
BookBiz bookBiz = new BookBiz();
//查询图书
@Override
public void query() {
bookBiz.query();
}
//购买图书
@Override
public Book buy(int bookid, int num) {
return bookBiz.buyBook(bookid, num);
}
//购买附赠品
@Override
public EX buyEx(int exCode) {
return bookBiz.buyEx(exCode);
}
//结账
public void checkout(Book book) {
bookBiz.checkout(book);
}
}
(2) 库管权限实现类
/*
* 库存管理员
* 接口实现
*/
public class DefaultStoreMgr implements StoreMgr {
BookBiz bookbiz = new BookBiz();
//入库
@Override
public void in(int bookid, int num) {
bookbiz.inBook(bookid, num);
}
//出库
@Override
public void out(int bookid, int num) {
bookbiz.outBook(bookid, num);
}
//新建
@Override
public void save(Book book) {
bookbiz.saveBook(book);
}
//查询
@Override
public void query() {
bookbiz.query();
}
}
3. 角色类(抽象类)
/*
* 角色类
*/
public class Role {
private String description; //角色描述
private StoreMgr storeMgr= null;//管理员权限
private Normal normal = null; //顾客权限
//省略若干getXxx()/setXxx()...
//入库
public void in(int bookid, int num) {
if(storeMgr==null) {
System.out.println("您没有管理员权限");
return;
}else
storeMgr.in(bookid, num);
}
//出库
public void out(int bookid, int num) {
if(storeMgr==null) {
System.out.println("您没有管理员权限");
return;
}else
storeMgr.out(bookid, num);
}
//新增图书
public void save(Book book) {
if(storeMgr==null) {
System.out.println("您没有管理员权限");
return;
}else
storeMgr.save(book);
}
//查询图书
public void query() {
if(storeMgr==null && normal==null) {
System.out.println("您没有登录,不能够查询图书");
return;
}else if(normal!=null) {
normal.query();
}else {
storeMgr.query();
}
}
//结账
public void checkout(Book book) {
if(normal==null) {
System.out.println("您还没有登录,不能够执行此操作");
return;
}else {
normal.checkout(book);
}
}
//购买图书
public Book buy(int bookid,int num) {
if(normal==null) {
System.out.println("您还没有登录,不能够执行此操作");
return null;
}else {
return normal.buy(bookid, num);
}
}
//购买附赠品
public EX buyEX(int exCode) {
if(normal==null) {
System.out.println("您还没有登录,不能够执行此操作");
return null;
}else {
return normal.buyEx(exCode);
}
}
}
4. 用户类
/*
* 用户类
*/
public class User {
private Role role ;//角色
//登录方法
public boolean login(String username,String password) {
if(username.equals(password)) {
if(username.equals("admin")) {
Role storeManager = new Role();//创建管理员角色
storeManager.setDescription("管理员");
//分配权限StoreMgr
StoreMgr dfStoreMgr = new DefaultStoreMgr();
storeManager.setStoreMgr(dfStoreMgr);
//为用户授权角色
this.setRole(storeManager);
}else {
Role customer = new Role();
customer.setDescription("顾客");
//创建顾客权限
Normal dfCustomer = new DefaultCustomer();
customer.setNormal(dfCustomer);
//为用户授权角色
this.setRole(customer);
}
return true;//登陆成功
}else {
System.out.println("抱歉,登录失败");
return false;
}
}
//图书入库
public void in(int bookid,int num) {
role.in(bookid, num);
}
//图书出库
public void out(int bookid,int num) {
role.out(bookid, num);
}
//新增图书
public void save(Book book) {
role.save(book);
}
//查看图书
public void query() {
role.query();
}
//结账
public void checkout(Book book) {
role.checkout(book);
}
//购买图书
public Book buy(int bookid, int num) {
return role.buy(bookid, num);
}
//购买附赠品
public EX buyEx(int exCode) {
return role.buyEX(exCode);
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
5. 创建一个库管用户的步骤
User user = new User(); //创建一个用户
Role storeManager = new StoreManager(); //创建一个角色
StoreMgr dfStoreMgr = new DefaultStoreMgr();//创建库管权限
storeManager.setStoreMgr(dfStoreMgr); //给角色分配权限
user.setRole(storeManager); //为用户授权角色
三、反思
重点在理解三者关系