Java/Spring -> 如何构建(设计模式)涉及同一进程的多个类之间的关系

Java/Spring -> how to structure (Design Pattern) the relationship between multiple classes involved in the same process

TLDR; 我的 DailyRecordDataManager class 有代码味道吗?是 'God Class' 吗?以及如何改进结构?

嗨,

我正在与 Spring 合作我的第一个项目。它将从马德里(我居住的地方)政府网站获取 covid-19 数据,按地区组织,并通过 API.

提供服务

这是我正在使用的 JSON 数据的示例。

{
  "codigo_geometria": "079603",
  "municipio_distrito": "Madrid-Retiro",
  "tasa_incidencia_acumulada_ultimos_14dias": 23.4668991007149,
  "tasa_incidencia_acumulada_total": 1417.23308497532,
  "casos_confirmados_totales": 1691,
  "casos_confirmados_ultimos_14dias": 28,
  "fecha_informe": "2020/07/01 09:00:00"
}

每个JSON对象是一个特定日期和特定市辖区的病例和感染率的记录。

程序获取数据后:解析它,过滤它,trims/rounds一些属性,按地区映射它,用它为每个地区创建一个对象(DistrictData),并写入地区 DistrictData 对象到 MonoDB 实例。

目前,根据单一职责原则,我已将流程中的每个步骤分开 classes。如 linked 截图所示:

screenshot of intellij package structure

我的问题是我不知道如何 link 这些多个 class 在一起。

目前我有一个经理 class 对我来说有点像上帝 Class:

@Service 
public class DailyRecordDataManager implements DataManager {

    private final Logger logger = LoggerFactory.getLogger(DailyRecordDataManager.class);

    private final DailyRecordDataCollector<String> dataCollector;
    private final DataVerifier<String> dataVerifier;
    private final JsonParser<DailyRecord> dataParser;
    private final DataFilter<List<DailyRecord>> dataFilter;
    private final DataTrimmer<List<DailyRecord>> dataTrimmer;
    private final DataSorter<List<DailyRecord>> dataSorter;
    private final DataMapper<List<DailyRecord>> dataMapper;
    private final DataTransformer dataTransformer;
    private final DistrictDataService districtDataService;

    public DailyRecordDataManager(DailyRecordDataCollector<String> collector,
                              DataVerifier<String> verifier,
                              JsonParser<DailyRecord> parser,
                              DataFilter<List<DailyRecord>> dataFilter,
                              DataTrimmer<List<DailyRecord>> dataTrimmer,
                              DataSorter<List<DailyRecord>> dataSorter,
                              DataMapper dataMapper,
                              DataTransformer dataConverter,
                              DistrictDataService districtDataService) {
        this.dataCollector = collector;
        this.dataVerifier = verifier;
        this.dataParser = parser;
        this.dataFilter = dataFilter;
        this.dataTrimmer = dataTrimmer;
        this.dataSorter = dataSorter;
        this.dataMapper = dataMapper;
        this.dataTransformer = dataConverter;
        this.districtDataService = districtDataService; 
    }

    @Override
    public boolean newData()  {

        String data = dataCollector.collectData();

        if (!dataVerifier.verifyData(data)) {
            logger.debug("Data is not new.");
            return false;
        }

        List<DailyRecord> parsedData = dataParser.parse(data);

        if (parsedData.size() == 0) {
            return false;
        }

        List<DailyRecord> filteredData = dataFilter.filter(parsedData);

        List<DailyRecord> trimmedData = dataTrimmer.trim(filteredData);

        List<DailyRecord> sortedData = dataSorter.sort(trimmedData);

        Map<String, List<DailyRecord>> mappedData = dataMapper.map(sortedData);

        List<DistrictData> convertedData = dataTransformer.transform(mappedData);

        districtDataService.save(convertedData);

        return true;
        } 
}

我还考虑过 link 将所有涉及的 class 整合到一个注入依赖链中 -> 所以每个 class 都有下一个 class作为依赖项的过程,如果数据没有任何问题,则在时间到了时调用链中的下一个 class。

不过我也觉得一定有一种设计模式可以解决我遇到的问题!

谢谢!

对于发现此内容并想知道我最终选择了什么的人 Pipeline pattern

它让我可以轻松地将我使用的所有个人 classes 组织到一个干净的工作流程中。它还使过程的每个阶段都非常容易测试。以及管道 class 本身!

我强烈建议任何对 Java 中的模式感兴趣的人查看我广泛使用的 this article