使用工厂模式+策略模式来优化代码结构

342 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。 ​

 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);
    }
}