美文网首页java日常开发
if-else代码优化方案①策略模式 ②Map+Function

if-else代码优化方案①策略模式 ②Map+Function

作者: 运气爆棚lsw | 来源:发表于2022-01-20 13:58 被阅读0次

    if-else?解决方案①策略模式 ②Map+Function函数式接口

    1.策略模式解决if-else

    策略模式是把 if语句里面的逻辑抽出来写成一个类,如果要修改某个逻辑的话,
    仅修改一个具体的实现类的逻辑即可,实现可维护性同时增加可扩展性,问题就是:会增加很多冗余的类

    示例代码如下:
    /**
     * @author lisanwei
     */
    public abstract class Business {
    
        /**
         * 定义父类实现功能共有方法
         *
         * @param dataSyncRecordVo 参数
         * @return 结果集
         */
        abstract Object queryData(DataSyncRecordVo dataSyncRecordVo);
    }
    
    /**
     * 可以独使用一个类
     */
    class Context {
        /**
         * 公共接口的引用,通过多态实现扩展调用
         */
        Business business;
    
        public Context(Business business) {
            this.business = business;
        }
    
        /**
         * 执行调用的方法
         *
         * @param dataSyncRecordVo 参数
         * @return 结果集
         */
        public Object contextInstance(DataSyncRecordVo dataSyncRecordVo) {
            return business.queryData(dataSyncRecordVo);
        }
    }
    
    两个业务实现类:
    public class BusinessQueryDetail extends Business {
        @Override
        Object queryData(DataSyncRecordVo dataSyncRecordVo) {
            return "仅仅做例子参考";
        }
    }
    
    
    public class BusinessQueryUser extends Business{
        @Override
        Object queryData(DataSyncRecordVo dataSyncRecordVo) {
            return "仅仅做例子参考";
        }
    }
    
    

    2.Map+Function函数式接口解决if-else

    /**
     * @author lisanwei
     */
    @Service
    public class BusinessTypeService {
    
        @Resource
        private BusinessService businessService;
        /**
         * 引入函数式接口
         */
        private final Map<String, Function<DataSyncRecordVo, Object>> businessTypeMap = new HashMap<>();
    
        /**
         * 初始化业务分派逻辑,代替了if-else部分
         * key: 判定执行业务名称
         * value: lambda表达式,最终会执行的业务类型
         */
        @PostConstruct
        public void dispatcherInit() {
            final Function<DataSyncRecordVo, Object>
                    userInfo = businessTypeMap.put("用户信息", (dataSyncRecordVo) -> businessService.dealerContract(dataSyncRecordVo));
    
            final Function<DataSyncRecordVo, Object>
                    userDetail = businessTypeMap.put("用户详情", (dataSyncRecordVo) -> businessService.dealerDecoration(dataSyncRecordVo));
        }
    
    
        /**
         * 调用方使用
         *
         * @param businessName     业务名称
         * @param dataSyncRecordVo 对象参数数据
         * @return 结果集
         */
        public Object getResult(String businessName, DataSyncRecordVo dataSyncRecordVo) {
            /* 传入businessName业务名称和参数即可动态获取*/
            Function<DataSyncRecordVo, Object> result = businessTypeMap.get(businessName);
            if (result != null) {
                return result.apply(dataSyncRecordVo);
            }
            return "=== 无法获取用户信息 ===";
        }
    
    }
    
    
    业务执行类
    /**
     * 业务Service
     *
     * @author lisanwei
     */
    @Service
    public class BusinessService {
    
        /**
         * 获取用户信息
         *
         * @param syncRecordVo 对象
         */
        public Object dealerContract(DataSyncRecordVo syncRecordVo) {
            return userMapper.selectUserById(syncRecordVo.getId());
        }
    
    
        /**
         * 获取用户详情
         *
         * @param syncRecordVo 参数
         */
        public Object dealerDecoration(DataSyncRecordVo syncRecordVo) {
            return userMapper.selectUserDetailById(syncRecordVo.getId());
        }
    }
    
    

    最简单的if-else代码冗余判断,代码比较堆叠,同时代码篇幅大,且不是很方便修改和维护代码,好处是代码比较易懂,策略模式通过接口、实现类、逻辑分派来完成,把 if语句块的逻辑抽出来写成一个类,更好维护,但是会产生更多的实现类,而Map+Function函数式接口通过Map.get(key)来代替 if-else的业务判断执行,能够避免策略模式带来的类增多、难以很清晰的了解业务问题,当然还有很多好的处理方式:比如通过Enum枚举的方式实现if-else的判断等,欢迎评论区留言

    相关文章

      网友评论

        本文标题:if-else代码优化方案①策略模式 ②Map+Function

        本文链接:https://www.haomeiwen.com/subject/ziejhrtx.html