Java策略模式-代替代码中大量的if...else

在开发过程中,许多的业务场景都用到了条件分支,即如果...就....,否则....就等场景。if...else是Java提供的传统的处理分支的实现方式。比如,以一个加减乘除作为案例,传统写法是这样的:


public void arithmetic(@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;

@Component
public interface BaseHandler {
    double arithmetic(int startNum, int endNum);
}

创建加减乘法四种业务对应的接口实现类
/*加法*/
@Component("addition")
public class AdditionHandler implements BaseHandler {
    @Override
    public double arithmetic(int startNum, int endNum) {
        return startNum + endNum;
    }
}


/*减法*/
@Component("division")
public class DivisionHandler implements BaseHandler {
    @Override
    public double arithmetic(int startNum, int endNum) {
        return startNum / endNum;
    }
}


/*乘法*/
@Component("multiplication")
public class multiplicationHandler implements BaseHandler {
    @Override
    public double arithmetic(int startNum, int endNum) {
        return startNum * endNum;
    }
}


/*除法*/
@Component("subtraction")
public class SubtractionHandler implements BaseHandler {
    @Override
    public double arithmetic(int startNum, int endNum) {
        return startNum - endNum;
    }
}

Controller类代码,使用@Autowired将BaseHandler注入
@RestController
@RequestMapping("action")
public class SpringTestController {

    @Autowired
    private Map<String, BaseHandler> handlerMap;

    @GetMapping("/handler")
    public void arithmetic(@RequestParam(value = "arithmeticType") String arithmeticType,
                           @RequestParam(value = "startNum") int startNum,
                           @RequestParam(value = "endNum") int endNum){
        BaseHandler baseHandler = handlerMap.get(arithmeticType);
        double result = baseHandler.arithmetic(startNum, endNum);
        System.out.println("===========>" + result);
    }
}

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

总结

  1. @component将所有的bean实例化到Spring中,是一个map格式,@component注解的属性值就是map的key。

  1. 使用设计模式完全避免了大量的if...else,代码看起来简洁,便于后期扩展和维护。

  1. 后期新增业务只需关注自己的业务点,不需要新增逻辑判断。

  1. 缺点就是需要创建很多的实现类。


参考链接:https://blog.csdn.net/XIAO_4510123/article/details/105272695?spm=1001.2101.3001.6650.12&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-12-105272695-blog-116993087.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-12-105272695-blog-116993087.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=20

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,可以使用策略模式代替 if else 语句。策略模式是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装起来,使它们可以相互替换。这样就可以在运行时动态地选择算法,而不必使用 if else 语句来判断。 下面是一个简单的例子,使用策略模式来计算商品的折扣价格: 首先,定义一个 DiscountStrategy 接口,其包含一个计算折扣价格的方法: ```java public interface DiscountStrategy { double calculateDiscount(double price); } ``` 然后,实现几个具体的 DiscountStrategy 实现类,如 NoDiscountStrategy、FixedDiscountStrategy、PercentageDiscountStrategy。这些类分别表示不打折、固定金额折扣、百分比折扣等不同的折扣策略。 最后,在需要计算折扣价格的地方,使用一个 DiscountContext 来选择具体的 DiscountStrategy 实现类,并调用其 calculateDiscount 方法: ```java public class DiscountContext { private DiscountStrategy strategy; public DiscountContext(DiscountStrategy strategy) { this.strategy = strategy; } public void setStrategy(DiscountStrategy strategy) { this.strategy = strategy; } public double calculateDiscountPrice(double price) { return strategy.calculateDiscount(price); } } ``` 使用时,可以这样调用: ```java DiscountContext context = new DiscountContext(new PercentageDiscountStrategy(0.2)); double originalPrice = 100.0; double discountedPrice = context.calculateDiscountPrice(originalPrice); ``` 这样,就可以根据具体的折扣策略来计算折扣价格,而不必使用 if else 语句来判断。同时,如果需要添加新的折扣策略,只需要实现一个新的 DiscountStrategy 实现类,并在 DiscountContext 设置即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值