使用没有内部静态类的流畅的构建器模式进行工作流

spakai

这是我在传递1到相同对象类型的许多参数的基础上的延续

我对此有很好的反馈,我相信我已经改进了设计。整个代码在https://github.com/spakai/flow_input_builder

要求很简单:-

我需要使用以前的工作流程中的一个或多个输出来为不同的工作流程构建一组输入

我有一组接口

public interface SwfInput {

}

public interface SwfOutput {

}

public interface Workflow<I extends SwfInput, O extends SwfOutput> {

    public O execute(I input);
}

public interface Builder<I extends SwfInput> {
    public I build();

}

现在,假设我有3个流,它们按顺序FlowA-> FlowB-> FlowC执行

FlowC需要FlowB的强制输出,但仅可选地需要FlowA

所以我有一个FlowCBuilder的实现

public class FlowCInputBuilder implements Builder<FlowCInput> {

    private final FlowBOutput mandatoryflowBOutput;
    private FlowAOutput optionalflowAOutput;

    public FlowAOutput getOptionalflowAOutput() {
        return optionalflowAOutput;
    }

    public FlowCInputBuilder setOptionalflowAOutput(FlowAOutput optionalflowAOutput) {
        this.optionalflowAOutput = optionalflowAOutput;
        return this;
    }

    public FlowCInputBuilder(FlowBOutput mandatoryflowBOutput) {
        this.mandatoryflowBOutput = mandatoryflowBOutput;
    }

    @Override
    public FlowCInput build() {

        FlowCInput input = new FlowCInput();
        input.setMandatoryFromFlowB(mandatoryflowBOutput.getOutput1FromB());

        if (optionalflowAOutput != null) {
            input.setOptionalFromFlowA(optionalflowAOutput.getOutput2FromA());
        }

        return input;       

    }


}

我写的一个测试显示了一个示例用法

 FlowBOutput mandatoryflowBOutput = new FlowBOutput();

 mandatoryflowBOutput.setOutput1FromB("iNeedThis");
 FlowAOutput optionalflowAOutput = new FlowAOutput();
 FlowCInput input =  new FlowCInputBuilder(mandatoryflowBOutput)
                .setOptionalflowAOutput(optionalflowAOutput)
                .build();

我没有为Builder模式使用静态内部类。

任何建议都欢迎。

Nghia Bui

您应该使用静态内部类。使用这种方法的关键在于,内部可以直接访问正在构造的对象的私有属性。这有助于消除重复的代码,因为构建器不需要维护一长串的临时状态。因此,您的代码可以像这样重写:

public class FlowCInput {
    private int output1FromB; // suppose that it is int
    private String output2FromA; // suppose that it is String
    private FlowCInput() { }
    //...

    public static class FlowCInputBuilder implements Builder<FlowCInput> {
        private final FlowCInput result;

        public FlowCInputBuilder(FlowBOutput mandatoryflowBOutput) {
            result = new FlowCInput();
            // output1FromB is private but still accessed from here
            result.output1FromB = mandatoryflowBOutput.getOutput1FromB();
        }

        public FlowCInputBuilder setOptionalflowAOutput(FlowAOutput optionalflowAOutput) {
            // same for output2FromA
            result.output2FromA = optionalflowAOutput.getOutput2FromA();
            return this;
        }

        @Override
        public FlowCInput build() {
            return result;
        }
    }
}

正如你看到的,建筑商现在只保存FlowCInput对象时,它不会不必要地持有mandatoryflowBOutputoptionalflowAOutput以前一样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在工作流启动器代码中要求工作流类

来自分类Dev

CI/CD 工作流的私有构建

来自分类Dev

将流畅的界面与构建器模式一起使用

来自分类Dev

Nextflow没有使用正确的服务帐户将工作流部署到kubernetes

来自分类Dev

使用 Alfresco 工作流控制台删除所有工作流

来自分类Dev

如何使用自定义工作流步骤查找所有工作流

来自分类Dev

设置Jenkins工作流(管道)构建的内部版本号

来自分类Dev

由于从挂起的VPN连接断开连接而刷新网络驱动器的方法没有工作流中断

来自分类Dev

业务运营/工作流设计模式

来自分类Dev

在自定义构建工作流参数编辑器中获取TFS连接

来自分类Dev

扩展方法、构建器模式和流畅接口之间有什么区别?

来自分类Dev

使用构建器模式进行对象验证

来自分类Dev

是否有用于注册/识别 Pandas 数据分析工作流模式的包?

来自分类Dev

使用 Grunt + Git 为 JavaScript 项目构建增量更新的工作流

来自分类Dev

可以使用状态机模式完成并行拆分工作流吗?

来自分类Dev

可以使用状态机模式来完成并行拆分工作流吗?

来自分类Dev

基于Python的异步工作流模块:celery工作流和luigi工作流有什么区别?

来自分类Dev

如何使用构建器模式构建抽象类?

来自分类Dev

使用 GoJs 创建子工作流

来自分类Dev

使用构建器模式时防止静态注入

来自分类Dev

Sharepoint工作流和事件接收器有什么区别?

来自分类Dev

Oozie:在协调器中重新运行所有非 SUCCEEDED 工作流

来自分类Dev

SharePoint 2013工作流内部状态已暂停

来自分类Dev

SharePoint 2013工作流内部状态已暂停

来自分类Dev

具有多个流的RTC工作流?

来自分类Dev

使用的工作流程设计模式类型?

来自分类Dev

Powershell工作流DynamicActivity编译器错误'。' 预期使用$ Date变量

来自分类Dev

只有一个类的构建器模式

来自分类Dev

使用工作流ID确保工作流的唯一性

Related 相关文章

  1. 1

    在工作流启动器代码中要求工作流类

  2. 2

    CI/CD 工作流的私有构建

  3. 3

    将流畅的界面与构建器模式一起使用

  4. 4

    Nextflow没有使用正确的服务帐户将工作流部署到kubernetes

  5. 5

    使用 Alfresco 工作流控制台删除所有工作流

  6. 6

    如何使用自定义工作流步骤查找所有工作流

  7. 7

    设置Jenkins工作流(管道)构建的内部版本号

  8. 8

    由于从挂起的VPN连接断开连接而刷新网络驱动器的方法没有工作流中断

  9. 9

    业务运营/工作流设计模式

  10. 10

    在自定义构建工作流参数编辑器中获取TFS连接

  11. 11

    扩展方法、构建器模式和流畅接口之间有什么区别?

  12. 12

    使用构建器模式进行对象验证

  13. 13

    是否有用于注册/识别 Pandas 数据分析工作流模式的包?

  14. 14

    使用 Grunt + Git 为 JavaScript 项目构建增量更新的工作流

  15. 15

    可以使用状态机模式完成并行拆分工作流吗?

  16. 16

    可以使用状态机模式来完成并行拆分工作流吗?

  17. 17

    基于Python的异步工作流模块:celery工作流和luigi工作流有什么区别?

  18. 18

    如何使用构建器模式构建抽象类?

  19. 19

    使用 GoJs 创建子工作流

  20. 20

    使用构建器模式时防止静态注入

  21. 21

    Sharepoint工作流和事件接收器有什么区别?

  22. 22

    Oozie:在协调器中重新运行所有非 SUCCEEDED 工作流

  23. 23

    SharePoint 2013工作流内部状态已暂停

  24. 24

    SharePoint 2013工作流内部状态已暂停

  25. 25

    具有多个流的RTC工作流?

  26. 26

    使用的工作流程设计模式类型?

  27. 27

    Powershell工作流DynamicActivity编译器错误'。' 预期使用$ Date变量

  28. 28

    只有一个类的构建器模式

  29. 29

    使用工作流ID确保工作流的唯一性

热门标签

归档