前言
系统都有角色的概念,不同用户分配不同的角色,每个角色访问的资源及权限不一样比如:
系统管理员( ROLE_ROOT_ADMIN):有 A操作权限
订单管理员( ROLE_ORDER_ADMIN):有 B操作权限
普通用户( ROLE_NORMAL):有 C操作权限
比如一个用户进来,我们需要根据不同用户的角色来判断其有哪些行为,这时候常见的代码出现了:
public void opt(String roleName) {
String result = "";
if (Objects.equals(roleName,"ROLE_ROOT_ADMIN")) { // 系统管理员有A权限
optSth();
} else if (Objects.equals(roleName,"ROLE_ORDER_ADMIN")) { // 订单管理员有B权限
optSth();;
} else if (Objects .equals(roleName,"ROLE_NORMAL")) { // 普通用户有C权限
optSth();;
} else {
optSth();;
}
}
这样当系统里有几十个角色时,几十个 if/else嵌套…… 这样一来非常不优雅,别人阅读起来很困难;二来则是以后如果再复杂一点,或者想要再加条件的话不好扩展;而且业务代码一改,以前的代码也容易出错
如何避免呢?
枚举
定义一个公用接口 RoleOperation,表示不同角色所能做的操作
public interface RoleOpt{
String op(); // 表示某个角色可以做哪些op操作
}
定义一个不同角色有不同权限的枚举类 RoleEnum
public enum RoleEnum implements RoleOpt{
// 系统管理员(有A操作权限)
ROLE_ROOT_ADMIN {
@Override
public String op() {
return "" ;
}
},
// 订单管理员(有B操作权限)
ROLE_ORDER_ADMIN {
@Override
public String op() {
return "";
}
},
// 普通用户(有C操作权限)
ROLE_NORMAL {
@Override
public String op() {
return "";
}
};
}
调用
public String opt( String roleName ) {
// 一行代码搞定!之前的if/else没了!
return RoleEnum.valueOf(roleName).op();
}
以后想扩充条件,只需要去枚举类中加代码即可
工厂模式
将不同情况单独定义好,然后去工厂类里面聚合
扫描二维码关注公众号,回复:
14412790 查看本文章

针对不同的角色,单独定义其业务类
public class RootAdminRole implements RoleOperation{
private String roleName;
@Override
public String op() {
return "";
}
}
同样定义其他角色处理类
OrderAdminRole NormalRole
工厂类 RoleFactory对上面不同角色进行聚合
public class RoleFactory{
staticMap<String, RoleOperation> roleOperationMap = newHashMap<>();
// 在静态块中先把初始化工作全部做完
static{
roleOperationMap.put( "ROLE_ROOT_ADMIN", new RootAdminRole("ROLE_ROOT_ADMIN") );
roleOperationMap.put( "ROLE_ORDER_ADMIN", new OrderAdminRole("ROLE_ORDER_ADMIN") );
roleOperationMap.put( "ROLE_NORMAL", new NormalRole("ROLE_NORMAL") );
}
public static RoleOperation getOp( String roleName ) {
return roleOperationMap.get( roleName );
}
}
业务代码调用
public String opt( String roleName ) {
// 一行代码搞定!之前的 if/else也没了!
return RoleFactory.getOp(roleName).op();
}