zoukankan      html  css  js  c++  java
  • 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();
    
        }
    
  • 相关阅读:
    第三篇:一个Spark推荐系统引擎的实现
    第二篇:使用Spark对MovieLens的特征进行提取
    第一篇:使用Spark探索经典数据集MovieLens
    第十一篇:Map/Reduce 工作机制分析
    docker 导入导出镜像
    pycharm激活
    jenkins + sonar 安装配置
    jenkins webhook 配置
    python3 学习
    Kubernetes 详解
  • 原文地址:https://www.cnblogs.com/dyaqi/p/12992744.html
Copyright © 2011-2022 走看看