一、思路说明
使用Map做一个策略选择,根据不同的判断类型从Map中取出对应的接口进行调用,把用if-else方式写的代码进行替换,属于策略设计模式的一种实现方式
二、开发场景
在业务开发中经常会看到下很多if-else的代码:
if (type == 1) {
// 业务1
}
else if (type == 2){
// 业务2
}
else {
// 业务3
}
又或者把上面的if-else换成switch写法,在正常的开发当中是家常便饭的写法了,这种写法会随着判断类型的增多if-else会越写越多导致代码变得臃肿,这样的代码无论在可读性和维护性都变得很差,所以我们需要对这样的代码进行优化,也就是使用本文中提到的Map+函数式接口的方式来实现
三、代码实现
说明:使用java8提供的lambda表达式,map中的key是判断条件值,value则是函数式接口,本文只是简单写实现的思路代码,重在体现思路给大家作为参考,后续可以根据自己的需求和理解去实现符合自己使用场景的代码
代码示例:
业务策略类
@Component
public class MapFunctionStrategy {
@Autowired
WorkTypeService workTypeService;
/**
* 根据不同的业务类型存放对应的函数
*/
private Map<String, Function<String,String>> workTypeMap=new HashMap<>();
/**
* 初始化workTypeMap,这里只是简单演示思路,后续可自行实现一个工厂类来统一管理workTypeMap
*/
@PostConstruct
public void initMap (){
workTypeMap.put("eat", name->workTypeService.eat(name));
workTypeMap.put("watch", name->workTypeService.watch(name));
workTypeMap.put("move", name->workTypeService.move(name));
}
/**
* 根据不同的workType获取对应的函数结果
* @param workType
* @return
*/
public String getAction(String workType, String name){
// 从map中取出对应的函数
Function<String,String> result=workTypeMap.get(workType);
if(result!=null){
// 传入参数执行函数
return result.apply(name);
}
return "不存在业务类型";
}
}
业务类
@Service
public class WorkTypeService {
public String eat(String name){
return "eat:" + name;
}
public String watch(String name){
return "watch:" + name;
}
public String move(String name){
return "move:" + name;
}
}
四、测试
测试方法自行实现,我这里简单写了个接口直接调用
五、补充
如果业务接口调用需要传入多个参数的,则需要自定义函数接口类
/**
* 自定义参数函数接口(两个输入参数)
* 默认的Function只能传1个参数
* @param <A> 参数1
* @param <B> 参数2
* @param <R> 结果
*/
@FunctionalInterface
interface Function2<A, B, R>{
R apply(A a, B b);
}
最后,感谢各位观看,如果有什么疑问和意见欢迎大家留言,我有空就会回复大家,谢谢!