Map+函数式接口方法解决 if-else

本文介绍策略模式的具体应用以及Map+函数式接口如何 “更完美” 的解决 if-else的问题。
最近写了一个服务,根据挂号的类型regType以及编码regId来查询 排队规则arriveType


实现方式

  • 根据挂号类型regType确定查询那张表
  • 根据编码regId到对应的数据表里查询排队的规则

挂号有很多中类型,分别对应不同的数据表:

  • 规则–>排队规则表
  • GOV_VIP
  • MER_VIP
  • NOMORAM

这个需求需要我们写一个业务分派的规则逻辑
第一个能想到的思路就是if-else或者switch case:

switch(regType){
            case "GOV_VIP":
                查询GOV_VIP的排队规则
                break;
            case "MER_VIP":
                查询MER_VIP的排队规则
                break;
            case "NOMORAM" :
                查询NOMORAM的排队规则
                break;


            default : logger.info("查找不到对应规则");
                break;
        }

如果要这么写的话, 一个方法的代码可就太长了,影响了可读性。(别看着上面case里面只有一句话,但实际情况是有很多行的)
而且由于 整个 if-else的代码有很多行,也不方便修改,可维护性低。


Map+函数式接口

用上了Java8的新特性lambda表达式

  • 判断条件放在key中
  • 对应的业务逻辑放在value中

这样子写的好处是非常直观,能直接看到判断条件对应的业务逻辑
上代码:

@Service
public class QueryGrantTypeService {
 
    @Autowired
    private GrantTypeSerive grantTypeSerive;
    private Map<String, Function<String,String>> grantTypeMap=new HashMap<>();

    /**
     *  初始化业务分派逻辑,代替了if-else部分
     *  key: 挂号类型
     *  value: lambda表达式,最终会获得该类型的排队方式
     */
    @PostConstruct
    public void dispatcherInit(){
        grantTypeMap.put("GOV_VIP",regId->grantTypeSerive.getGov(resourceId));
        grantTypeMap.put("MER_VIP",regId->grantTypeSerive.getMER(resourceId));
        grantTypeMap.put("NOMORAM",regId->grantTypeSerive.getNOMORAM(resourceId));
    }
 
    public String getResult(String resourceType){
        //Controller根据 排队类型redType、编码regId 去查询 排队方式
        Function<String,String> result=getGrantTypeMap.get(regType);
        if(result!=null){
         //传入regId 执行这段表达式获得String型的grantType
            return result.apply(regId);
        }
        return "查询不到该挂号类型的排队方式";
    }
}

用http调用:

@RestController
public class GrantTypeController {

    @Autowired
    private QueryGrantTypeService queryGrantTypeService;

    @PostMapping("/regType")
    public String test(String regType){
        return queryGrantTypeService.getResult(regType);
    }
}

总结

策略模式通过接口、实现类、逻辑分派来完成,把 if语句块的逻辑抽出来写成一个类,更好维护。

Map+函数式接口通过Map.get(key)来代替 if-else的业务分派,能够避免策略模式带来的类增多、难以俯视整个业务逻辑的问题。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拉霍拉卡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值