if-else?解决方案①策略模式 ②Map+Function函数式接口
1.策略模式解决if-else
策略模式是把 if语句里面的逻辑抽出来写成一个类,如果要修改某个逻辑的话,
仅修改一个具体的实现类的逻辑即可,实现可维护性同时增加可扩展性,问题就是:会增加很多冗余的类
示例代码如下:
/**
* @author lisanwei
*/
public abstract class Business {
/**
* 定义父类实现功能共有方法
*
* @param dataSyncRecordVo 参数
* @return 结果集
*/
abstract Object queryData(DataSyncRecordVo dataSyncRecordVo);
}
/**
* 可以独使用一个类
*/
class Context {
/**
* 公共接口的引用,通过多态实现扩展调用
*/
Business business;
public Context(Business business) {
this.business = business;
}
/**
* 执行调用的方法
*
* @param dataSyncRecordVo 参数
* @return 结果集
*/
public Object contextInstance(DataSyncRecordVo dataSyncRecordVo) {
return business.queryData(dataSyncRecordVo);
}
}
两个业务实现类:
public class BusinessQueryDetail extends Business {
@Override
Object queryData(DataSyncRecordVo dataSyncRecordVo) {
return "仅仅做例子参考";
}
}
public class BusinessQueryUser extends Business{
@Override
Object queryData(DataSyncRecordVo dataSyncRecordVo) {
return "仅仅做例子参考";
}
}
2.Map+Function函数式接口解决if-else
/**
* @author lisanwei
*/
@Service
public class BusinessTypeService {
@Resource
private BusinessService businessService;
/**
* 引入函数式接口
*/
private final Map<String, Function<DataSyncRecordVo, Object>> businessTypeMap = new HashMap<>();
/**
* 初始化业务分派逻辑,代替了if-else部分
* key: 判定执行业务名称
* value: lambda表达式,最终会执行的业务类型
*/
@PostConstruct
public void dispatcherInit() {
final Function<DataSyncRecordVo, Object>
userInfo = businessTypeMap.put("用户信息", (dataSyncRecordVo) -> businessService.dealerContract(dataSyncRecordVo));
final Function<DataSyncRecordVo, Object>
userDetail = businessTypeMap.put("用户详情", (dataSyncRecordVo) -> businessService.dealerDecoration(dataSyncRecordVo));
}
/**
* 调用方使用
*
* @param businessName 业务名称
* @param dataSyncRecordVo 对象参数数据
* @return 结果集
*/
public Object getResult(String businessName, DataSyncRecordVo dataSyncRecordVo) {
/* 传入businessName业务名称和参数即可动态获取*/
Function<DataSyncRecordVo, Object> result = businessTypeMap.get(businessName);
if (result != null) {
return result.apply(dataSyncRecordVo);
}
return "=== 无法获取用户信息 ===";
}
}
业务执行类
/**
* 业务Service
*
* @author lisanwei
*/
@Service
public class BusinessService {
/**
* 获取用户信息
*
* @param syncRecordVo 对象
*/
public Object dealerContract(DataSyncRecordVo syncRecordVo) {
return userMapper.selectUserById(syncRecordVo.getId());
}
/**
* 获取用户详情
*
* @param syncRecordVo 参数
*/
public Object dealerDecoration(DataSyncRecordVo syncRecordVo) {
return userMapper.selectUserDetailById(syncRecordVo.getId());
}
}
最简单的if-else代码冗余判断,代码比较堆叠,同时代码篇幅大,且不是很方便修改和维护代码,好处是代码比较易懂,策略模式通过接口、实现类、逻辑分派来完成,把 if语句块的逻辑抽出来写成一个类,更好维护,但是会产生更多的实现类,而Map+Function函数式接口通过Map.get(key)来代替 if-else的业务判断执行,能够避免策略模式带来的类增多、难以很清晰的了解业务问题,当然还有很多好的处理方式:比如通过Enum枚举的方式实现if-else的判断等,欢迎评论区留言