if/else的几种优化方式

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();

    }
posted @ 2020-05-30 15:05  Dyaqi  阅读(657)  评论(0编辑  收藏  举报