java日常开发

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

2022-01-20  本文已影响0人  运气爆棚lsw

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的判断等,欢迎评论区留言

上一篇 下一篇

猜你喜欢

热点阅读