小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
1. 业务场景
我们在新做的项目中有一个这样的应用场景,用户会导入不同平台的数据来存入mongodb中,不同平台的数据格式不一样,使用传统的mongoDB Model的方式需要建立太多的model,在后期维护上新加一个平台就需要增加一个model类重新上线一次,在可用性上不太合适,于是我考虑到工厂模式+策略模式来优化代码结构
2. 流程图
3. 代码
-
service interface
```
public interface MongoEndurance {
String getLivePlatfarm();
ApiRes<Collection<?>> endurance(List<?> enduranceList);
ApiRes<Collection<?>> endurance(List<?> list, String collectionName);
ApiRes<Collection<?>> enduranceModel(List<?> enduranceList);
ApiRes<Collection<?>> query(String collectionName, Query query);
ApiRes<Collection<?>> query(String collectionName);
<T> ApiRes<List<T>> findAggregateList(String collectionName, Aggregation aggregation, Class<T> clazz);
}
```
-
service impl
@Service
@Primary
public class BaseEnduranceImpl implements MongoEndurance {
private static final String COLLECTION_NAME = "DEFULT";
@Autowired
protected BaseEnduranceDao baseEnduranceDao;
@Override
public String getLivePlatfarm() {
return COLLECTION_NAME;
}
/**
* @title mongoDB持久化
* @description 根据COLLECTION_NAME持久化mongo数据
* @param: list
* @createTime 2021/9/15 15:59
*/
@Override
public ApiRes<Collection<?>> endurance(List<?> list) {
Collection<?> collection = baseEnduranceDao.insertBatch(list,COLLECTION_NAME);
ApiRes<Collection<?>> apiRes = new ApiRes<>(collection);
return collection == null ? apiRes.fail(ResErrorCodeEnum.C.REQUEST_PARAMETER_ERROR) : apiRes;
}
/**
* @title 自定义集合持久化
* @description 根据collectionName集合名称初始化
* @param: list
* @param: collectionName
* @createTime 2021/9/15 16:00
*/
@Override
public ApiRes<Collection<?>> endurance(List<?> list, String collectionName) {
Collection<?> collection = baseEnduranceDao.insertBatch(list,collectionName);
ApiRes<Collection<?>> apiRes = new ApiRes<>(collection);
return collection == null ? apiRes.fail(ResErrorCodeEnum.C.REQUEST_PARAMETER_ERROR) : apiRes;
}
/**
* @title model集合初始化
* @description 根据传递的model初始化
* @param: enduranceList
* @createTime 2021/9/15 16:01
*/
@Override
public ApiRes<Collection<?>> enduranceModel(List<?> enduranceList) {
if (enduranceList == null){
return new ApiRes<Collection<?>>().fail(ResErrorCodeEnum.C.REQUEST_PARAMETER_ERROR);
}
Collection<?> s = baseEnduranceDao.insertBatch(enduranceList);
return new ApiRes<>(s);
}
/**
* @title mongo数据查询
* @description 根据传递的collectionName和Query进行查询
* @param: collectionName
* @param: query
* @createTime 2021/9/16 11:27
*/
@Override
public ApiRes<Collection<?>> query(String collectionName, Query query) {
// 如果query为null返回异常信息
if (query == null || StringUtil.isNullOrEmpty(collectionName)){
return new ApiRes<Collection<?>>().fail(ResErrorCodeEnum.C.REQUEST_PARAMETER_ERROR);
}
Collection<?> s = baseEnduranceDao.query(collectionName, query);
return new ApiRes<>(s);
}
/**
* @title mongo数据查询
* @description 查询collectionName全部数据
* @param: collectionName
* @createTime 2021/9/16 15:04
*/
@Override
public ApiRes<Collection<?>> query(String collectionName) {
if (StringUtil.isNullOrEmpty(collectionName)){
return new ApiRes<Collection<?>>().fail(ResErrorCodeEnum.C.REQUEST_PARAMETER_ERROR);
}
Collection<?> s = baseEnduranceDao.query(collectionName);
return new ApiRes<>(s);
}
/**
* @title mongo数据查询
* @description 根据Aggregation查询,可聚合查询
* @param: collectionName,aggregation,clazz
* @createTime 2021/9/24 11:51
*/
@Override
public <T> ApiRes<List<T>> findAggregateList(String collectionName, Aggregation aggregation, Class<T> clazz) {
if (StringUtil.isNullOrEmpty(collectionName)){
return new ApiRes<List<T>>().fail(ResErrorCodeEnum.C.REQUEST_PARAMETER_ERROR);
}
List<T> s = baseEnduranceDao.findAggregateList(collectionName,aggregation,clazz);
return new ApiRes<>(s);
}
}
@Service
public class WeizanEnduranceImpl extends BaseEnduranceImpl implements MongoEndurance {
private static final String COLLECTION_NAME = "weizan";
@Override
public String getLivePlatfarm() {
return CommonEnum.LivePlatformEnum.WEI_ZAN.getValue();
}
@Override
public ApiRes<Collection<?>> endurance(List<?> list) {
Collection<?> collection = baseEnduranceDao.insertBatch(list,COLLECTION_NAME);
ApiRes<Collection<?>> apiRes = new ApiRes<>(collection);
return collection == null ? apiRes.fail(ResErrorCodeEnum.C.REQUEST_PARAMETER_ERROR) : apiRes;
}
}
-
Strategy
@Component
public class Strategy {
@Autowired
private List<MongoEndurance> mongoEnduranceList;
private static Map<String, MongoEndurance> mongoStrategyMap;
public Strategy() {
}
@PostConstruct
public void init() {
// 以子类的livePlatfarm为K转换为<K,V>格式
mongoStrategyMap = (Map)this.mongoEnduranceList.stream().collect(Collectors.toMap(MongoEndurance::getLivePlatfarm, (a) -> {
return a;
}));
}
/**
* @title 获取实现类
* @description 根据直播平台标识获取对应实现类
* @author ANZEPENG
* @createTime 2021/9/15 15:51
*/
public MongoEndurance getStrategy(String livePlatfarm) {
// 如果没有标识默认Base实现类
if (livePlatfarm == null){
livePlatfarm = "DEFULT";
}
return mongoStrategyMap.get(livePlatfarm);
}
}