-
案例:在开发中会遇到一些业务有很多的场景需要处理,下面使用加减乘法模拟业务场景
一般情况下我们会想到使用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调试查看
-
总结
- @component将所有的bean实例化到Spring中,是一个map格式,@component注解的属性值就是map的key。
- 使用设计模式完全避免了大量的if...else,代码看起来简洁,便于后期扩展和维护。
- 后期新增业务只需关注自己的业务点,不需要新增逻辑判断。
- 缺点就是需要创建很多的实现类。