记一次重构,策略模式替换if else

本文记录了一次重构过程,将原本基于if-else的代码替换为策略模式。场景涉及从数据库A筛选数据,结合数据库B的规则进行二次筛选。在第1版中直接使用固定值,第2版引入后管系统但不满足扩展性。在第3版,通过学习策略模式,设计了策略类接口和实现类,实现了更灵活的代码结构,提高了可维护性和扩展性。
摘要由CSDN通过智能技术生成
场景

先说一下大概要做的事情。我需要先从数据库A中筛选出一周的基础数据,调用接口获取数据库B中的规则,再做一次数据筛选,然后入库数据库B。定时任务每周跑一次。
呐,说到这里,也大概知道了,在数据筛选那里,将会有业务判断。伪代码就集中展示那里。

第1版

考虑时间等各种因素,先实现再说。此处并没有用到数据库B中的规则,直接在项目中写的固定值。

for(CustomerResource customerResource : customerResourceList){
   
	//TODO 
	//V1
	//条件1 
	if(customerResource.getFactoryPrice().intValue() < -10){
   
	    condition1 = true;
	}else {
   
	    continue;//条件1未满足,直接忽略
	}
	//条件2 
	if(customerResource.getLastWeekSales().intValue() > 100){
   
	    condition2 = true;
	}else {
   
	    continue;//条件2未满足,直接忽略
	}
	//条件3 
	if(factoryDay.get(customerResource.getFactoryCode()) == null ? false : factoryDay.get(customerResource.getFactoryCode()) > 3){
   
	    condition3 = true;
	}else{
   condition3 = false;}
	//条件4 
	if(factorySales.get(customerResource.getFactoryCode()) == null ? false :
	        customerResource.getLastWeekSales().divide(factorySales.get(customerResource.getFactoryCode()),2,BigDecimal.ROUND_HALF_UP).doubleValue() > 1.1){
   
	    condition4 = true;
	}else{
   condition4 = false;}
	
	//根据4个条件归类
}
第2版

等到第1版本实现以后,筛选出的数据基本上已经是想要的数据。但是不利于规则的扩展。便于维护,后续在后管系统做页面。

存在每个工厂的规则数量(目前4条)是一样,但是规则中比较的数值存在变动,比较存在变动(符号)。

如此一来,第1版本显然已经不符合需求了。

for(CustomerResource customerResource : customerResourceList){
   
	//获取工厂的规则
    List<CustomerResourceRule> rules = factoryRulesMap.get(customerResource.getFactoryCode());
    if(rules == null){
   //未获取到该工厂的规则
        continue;
    }
    for(CustomerResourceRule rule : rules){
   
		// V2
		//条件1 
		if(ConditionEnum.CONDITION1.getRuleCode().equals(rule.getRuleCode())){
   
		    switch (SymbolEnum.getBySymbol(rule.getSymbol())){
   
		        case GT:
		            condition1 = customerResource.getFactoryPrice().intValue() > Integer.parseInt(rule.getSetValue());
		            break;
		        case LT:
		            condition1 = customerResource.getFactoryPrice().intValue() < Integer.parseInt(rule.getSetValue
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值