【发布时间】:2019-12-23 06:55:32
【问题描述】:
我必须通过一系列步骤处理请求。
例如:如果请求 1 来了,那么我必须应用 step1、step2、step3 和最后的 step4,它将处理后的请求持久化到数据库中。
我想实现 模板设计 模式,因为它解决了类似的问题。
当我开始实现设计模式时,我突然发现很难实现,因为逻辑复杂。
让我解释一下要求:
请求 -> 控制器 -> run()
请求将包含List<objects>。
在 run 方法中,会触发一系列操作。
request.parallelStream()
.map(step1 -> executeStep1.apply(step1))
.map(step2 -> executeStep2.apply(step2, action))
.map(step3 -> executeStep3.apply(step3, rules))
.map(step4 -> executeStep4.apply(step4))
.collect(Collectors.toList());
Function<String, List<PersonDto>> executeStep1= person-> {
return metaData.getMetaDataPerson(person);
};
BiFunction<List<PersonDto>, String, TransTemplateDTO> executeStep2= (metaData, action) -> {
return temlate.createTemplate(metaData, action);
};
现在,我们可以看到,我将request 的第一个元素作为输入传递给 step1(),然后对其进行处理,并将输出作为输入进一步传递给后续步骤。
-
问题 1:
到目前为止,没有任何问题。但突然需求发生了变化,现在我必须在 step3 中添加规则逻辑,即executeStep3.apply(step3)。step3 有 2 个参数,一个是 step2 的输出,第二个是 List 规则。
Step3 应该应用所有规则并返回与规则相等的结果。
例如。如果有 3 个规则,则 step3 应该返回一个包含 3 个对象的列表。
假设 step3 收到PersonDtoList of 10 items 和 List of rules of 3 items,那么 step3 应该返回 10*3 = 30 条记录。
每个人的规则也将根据命令而有所不同。 问题 2:
在第 3 步中,我需要请求对象,以便我可以使用值。 像这样:.map(step3 -> executeStep3.apply(step3, rules, request))
什么设计模式在这里有帮助?如何?
【问题讨论】:
-
(我看不出与 Spring Boot、第八版 Java 或任何定义明确的步骤序列有特殊关系定义了一个抽象解决方案:请在问题中明确说明或删除这些标签。)
-
@greybeard - 如果您可以浏览代码,那么您会注意到我正在使用 parallelStream(),它是 Java 8 的一部分。
-
不管我能不能,当前是第 13 版,没有任何迹象表明
java.util.Collection.parallelStream()很快就会被弃用。 java-stream 有一个标签。
标签: java algorithm spring-boot design-patterns java-8