Java设计模式之用户、角色和权限

一、定义

角色决定了用户有哪些权限
简单来说,就是通过给用户授权角色,用户就获得了属于该角色的权限。这样分配就不用分别创建不同的用户类,只需要给用户类赋予不同的角色属性就可以实现不同的用户。另外,这种模式使系统易于扩展和维护。比如当要给某一种用户增加新的权限时,只要给角色增加权限即可,不需要对若干用户对象一一操作。在实际开发中,遇到权限划分的问题,经常一般可以采用用户、角色、权限模式

1. 权限

权限是操作,是针对行为的。一般把行为、能力抽象为接口,所以把权限也抽象为接口(interface)。注意接口类和接口实现类的对应。

2. 角色

角色类一般为抽象类(Role),角色类的属性有权限和角色描述,方法有一些get()/set()和权限的分配操作。

3. 用户

用户类可以普通类。拥有一个角色属性。

二、实例

星云书店系统的用户分为两类,即库管顾客

库管的行为有:图书入库、图书出库、新增图书和查询图书

顾客的行为有:查询图书、购买图书、购买附赠品和结账。

可设计出如下的接口类角色类用户类

java账户类 java用户角色权限_ide


java账户类 java用户角色权限_ide_02

java账户类 java用户角色权限_java_03

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);					//为用户授权角色

三、反思

重点在理解三者关系