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();
    
        }
    
  • 相关阅读:
    mysql中字符集和排序规则说明
    结束进程的批处理文件
    内有干货!2个人3个月怎样从零完毕一款社区App《林卡》
    九度OJ 1006 ZOJ问题 (这题測试数据有问题)
    简易版的堆的写法
    hbase
    JNDI配置c3p0连接池
    [effictive c++] 条款04 确定对象被使用前已被初始化
    第九十五题(推断一字符串是不是对称的)
    OpenFace库(Tadas Baltrusaitis)中基于Haar Cascade Classifiers进行人脸检測的測试代码
  • 原文地址:https://www.cnblogs.com/dyaqi/p/12992744.html
Copyright © 2011-2022 走看看