Java设计模式(二)用户、角色、权限模式,面向对象、面向接口的思想

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();//查询图书@Overridepublic void query() {bookBiz.query();		}//购买图书@Overridepublic Book buy(int bookid, int num) {return bookBiz.buyBook(bookid, num);}//购买附赠品@Overridepublic 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();//入库@Overridepublic void in(int bookid, int num) {bookbiz.inBook(bookid, num);}//出库@Overridepublic void out(int bookid, int num) {bookbiz.outBook(bookid, num);}//新建@Overridepublic void save(Book book) {bookbiz.saveBook(book);}//查询@Overridepublic 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;}elsestoreMgr.in(bookid, num);}//出库public void out(int bookid, int num) {if(storeMgr==null) {System.out.println("您没有管理员权限");return;}elsestoreMgr.out(bookid, num);}//新增图书public void save(Book book) {if(storeMgr==null) {System.out.println("您没有管理员权限");return;}elsestoreMgr.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("管理员");//分配权限StoreMgrStoreMgr 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);					//为用户授权角色

三、反思

重点在理解三者关系


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部