1、示例
- 系统管理员(ROLE_ROOT_ADMIN):有 A操作权限
- 订单管理员(ROLE_ORDER_ADMIN):有 B操作权限
- 普通用户(ROLE_NORMAL):有 C操作权限
2、优化前
public String judge1(String roleName) {
String result = "";
if (roleName.equals("ROLE_ROOT_ADMIN")) {
// 系统管理员有A权限
result = "ROLE_ROOT_ADMIN: " + "has AAA permission";
} else if (roleName.equals("ROLE_ORDER_ADMIN")) {
// 订单管理员有B权限
result = "ROLE_ORDER_ADMIN: " + "has BBB permission";
} else if (roleName.equals("ROLE_NORMAL")) {
// 普通用户有C权限
result = "ROLE_NORMAL: " + "has CCC permission";
}
return result;
}
3、优化--switch/case
public String judge2(String roleName) {
String result = "";
switch (roleName){
case "ROLE_ROOT_ADMIN":
// 系统管理员有A权限
result = "ROLE_ROOT_ADMIN: " + "has AAA permission";
case "ROLE_ORDER_ADMIN":
// 订单管理员有B权限
result = "ROLE_ORDER_ADMIN: " + "has BBB permission";
case "ROLE_NORMAL":
// 普通用户有C权限
result = "ROLE_NORMAL: " + "has CCC permission";
}
return result;
}
其实 使用 switch/case 和if/else 一毛一样。
4、优化--枚举
什么角色能干什么事,这很明显有一个对应关系,所以学过的枚举为啥不用呢?
/**
* @author Dyaqi
* @date 2020/4/1 17:57
* @功能描述: 定义一个公用接口 RoleOperation,表示不同角色所能做的操作
*/
public interface RoleOperation {
String op(); // 表示某个角色可以做哪些op操作
}
/**
* @author Dyaqi
* @date 2020/4/1 17:57
* @功能描述: 将不同角色的情况全部交由枚举类来做,定义一个不同角色有不同权限的枚举类 RoleEnum:
*/
public enum RoleEnum implements RoleOperation {
// 系统管理员有A权限
ROLE_ROOT_ADMIN {
@Override
public String op() {
return "ROLE_ROOT_ADMIN: " + "has AAA permission";
}
},
// 系统管理员有A权限
ROLE_ORDER_ADMIN {
@Override
public String op() {
return "ROLE_ORDER_ADMIN: " + "has BBB permission";
}
},
// 系统管理员有A权限
ROLE_NORMAL {
@Override
public String op() {
return "ROLE_NORMAL: " + "has CCC permission";
}
};
}
一行代码搞定!以后假如我想扩充条件,只需去枚举类中加代码,而不是去修改以前的代码。
public static void main(String[] args) {
RoleEnum.valueOf("ROLE_NORMAL").op();
}
5、优化--工厂模式
不同分支做不同的事情,很明显就提供了使用工厂模式的契机,我们只需要将不同情况单独定义好,然后去工厂类里面聚合即可。
/**
* @author Dyaqi
* @date 2020/4/1 17:57
* @功能描述: 定义一个公用接口 RoleOperation,表示不同角色所能做的操作
*/
public interface RoleOperation {
String op(); // 表示某个角色可以做哪些op操作
}
针对不同的角色,单独定义其业务类:
/**
* @author Dyaqi
* @date 2020/5/30 14:44
* @功能描述:
*/
public class RootRole implements RoleOperation{
private String roleName;
public RootRole(String roleName){
this.roleName = roleName;
}
@Override
public String op() {
return roleName + "has AAA permission";
}
}
/**
* @author Dyaqi
* @date 2020/5/30 14:44
* @功能描述:
*/
public class OrderRole implements RoleOperation{
private String roleName;
public OrderRole(String roleName){
this.roleName = roleName;
}
@Override
public String op() {
return roleName + "has BBB permission";
}
}
/**
* @author Dyaqi
* @date 2020/5/30 14:44
* @功能描述:
*/
public class NormalRole implements RoleOperation{
private String roleName;
public NormalRole(String roleName){
this.roleName = roleName;
}
@Override
public String op() {
return roleName + "has CCC permission";
}
}
接下来再写一个工厂类 RoleFactory对上面不同角色进行聚合:
package com.dyaqi.demo;
import java.util.HashMap;
import java.util.Map;
/**
* @author Dyaqi
* @date 2020/5/30 14:44
* @功能描述:
*/
public class RoleFactory {
static Map<String,RoleOperation> roleOperationMap = new HashMap<>();
static {
roleOperationMap.put("ROLE_ROOT_ADMIN",new RootRole("ROLE_ROOT_ADMIN"));
roleOperationMap.put("ROLE_ORDER_ADMIN",new OrderRole("ROLE_ORDER_ADMIN"));
roleOperationMap.put("ROLE_NORMAL",new NormalRole("ROLE_NORMAL"));
}
public static RoleOperation getOp(String roleName){
return roleOperationMap.get(roleName);
}
}
接下来借助上面这个工厂,业务代码调用也只需一行代码
public static void main(String[] args) {
RoleEnum.valueOf("ROLE_NORMAL").op();
}