Java使用设计模式代替代码中大量的if...else

  • 案例:在开发中会遇到一些业务有很多的场景需要处理,下面使用加减乘法模拟业务场景

一般情况下我们会想到使用if...else,如下代码。但是实际的业务场景肯定不止这四种,随着条件越来也来,代码就显得非常的臃肿和难以维护。(也可以使用switch来实现,这里就不赘述了)

public void arithmetic02(@RequestParam(value = "arithmeticType") String arithmeticType,
                             @RequestParam(value = "startNum") int startNum,
                             @RequestParam(value = "endNum") int endNum) {

        double result = 0.0;
        if (arithmeticType.equals("addition")) {
            result = startNum + endNum;
        } else if (arithmeticType.equals("subtraction")) {
            result = startNum - endNum;
        } else if (arithmeticType.equals("multiplication")) {
            result = startNum * endNum;
        } else {
            result = startNum / endNum;
        }
        System.out.println("====================>" + result);

  }
  • 重构:下面使用设计模式,对业务进行重构

创建一个接口类:BaseHandler

import org.springframework.stereotype.Component;

/**
 * @author Xiaojianpeng
 * @version 1.0
 * @date 2020/4/1 14:21
 */

@Component
public interface BaseHandler {

    double arithmetic(int startNum, int endNum);

}

创建加减乘法四种业务对应的接口实现类

/**
 * 加法操作
 * @author Xiao
 * @version 1.0
 * @date 2020/4/1 14:23
 */

@Component("addition")
public class AdditionHandler implements BaseHandler {


    @Override
    public double arithmetic(int startNum, int endNum) {
        return startNum + endNum;

    }
}




/**
 * 减法操作
 * @author Xiao
 * @version 1.0
 * @date 2020/4/1 14:23
 */

@Component("subtraction")
public class SubtractionHandler implements BaseHandler {


    @Override
    public double arithmetic(int startNum, int endNum) {

        return startNum + endNum;

    }
}



/**
 * 乘法操作
 * @author Xiao
 * @version 1.0
 * @date 2020/4/1 14:24
 */
@Component("multiplication")
public class MultiplicationHandler implements BaseHandler {


    @Override
    public double arithmetic(int startNum, int endNum) {
        return startNum * endNum;
    }
}



/**
 * 除法操作
 * @author Xiao
 * @version 1.0
 * @date 2020/4/1 14:23
 */

@Component("division")
public class DivisionHandler implements BaseHandler {


    @Override
    public double arithmetic(int startNum, int endNum) {
        return startNum / endNum;
    }
}

Controller类代码,使用@Autowired将BaseHandler注入

@RestController
@RequestMapping("/arithmetic")
public class ArithmeticController {

    @Autowired
    private Map<String,BaseHandler> handlerMap;

    /**
     * @param arithmeticType: 对应着接口实现类中@Component注解的属性值
     * @param startNum
     * @param endNum
     */
    @GetMapping("/handler")
    public void arithmetic01(@RequestParam(value = "arithmeticType") String arithmeticType,
                           @RequestParam(value="startNum") int startNum,
                           @RequestParam(value = "endNum") int endNum) {

        BaseHandler handler = handlerMap.get(arithmeticType);
        double result = handler.arithmetic(startNum, endNum);
        System.out.println("====================>" + result);

    }
}

@component注解会把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="",class=""/>,启动项目时加载到handlerMap中,下面通过debug调试查看

 

  • 总结

  1. @component将所有的bean实例化到Spring中,是一个map格式,@component注解的属性值就是map的key。
  2. 使用设计模式完全避免了大量的if...else,代码看起来简洁,便于后期扩展和维护。
  3. 后期新增业务只需关注自己的业务点,不需要新增逻辑判断。
  4. 缺点就是需要创建很多的实现类。

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值