当前位置: 首页 > 知识库问答 >
问题:

流水线设计模式实现

阎星河
2023-03-14
public interface Step<T, U> {
    public U execute(T input);
}
public class StepOne implements Step<Integer, Integer> {
    @Override
    public Integer execute(Integer input) {
        return input + 100;
    }
}

public class StepTwo implements Step<Integer, Integer> {
    @Override
    public Integer execute(Integer input) {
        return input + 500;
    }
}

public class StepThree implements Step<Integer, String> {
    @Override
    public String execute(Integer input) {
        return "The final amount is " + input;
    }
}
public class Pipeline {
    private List<Step> pipelineSteps = new ArrayList<>();
    private Object firstStepInput = 100;

    public void addStep(Step step) {
        pipelineSteps.add(step);
    }

    public void execute() {
        for (Step step : pipelineSteps) {
            Object out = step.execute(firstStepInput);
            firstStepInput = out;
        }
   }
}
public class Main {
    public static void main(String[] args) {
        Pipeline pipeline = new Pipeline();
        pipeline.addStep(new StepOne());
        pipeline.addStep(new StepTwo());
        pipeline.addStep(new StepThree());

        pipeline.execute();
    } 
}

有人可以通过添加到我已经编码的内容来帮助我设计解决方案吗?或者向我指出一个已经存在的模式来解决这个问题?

共有1个答案

楚权
2023-03-14

为什么需要额外的管道类?我想你可以除掉中间人。这将使您的api更加简单,例如:

Step<Integer, String> source = Step.of(Object::toString);
Step<Integer, Integer> toHex = source.pipe(it -> Integer.parseInt(it, 16));

toHex.execute(11/*0x11*/);// return 17;

您可以简单地在java-8中实现管道模式,如下所示:

interface Step<I, O> {

    O execute(I value);

    default <R> Step<I, R> pipe(Step<O, R> source) {
        return value -> source.execute(execute(value));
    }

    static <I, O> Step<I, O> of(Step<I, O> source) {
        return source;
    }
}

在以前的java版本中,您可以使用抽象类:

abstract static class Step<I, O> {

    public abstract O execute(I value);

    public <R> Step<I, R> pipe(Step<O, R> source) {
        return new Step<I, R>() {
            @Override
            public R execute(I value) {
                return source.execute(Step.this.execute(value));
            }
        };
    }

    public static <I, O> Step<I, O> of(Step<I, O> source) {
        return source;
    }
}
 类似资料:
  • 在本节中,我们将研究如何链接不同的估计器。 简单示例:估计器之前的特征提取和选择 特征提取:向量化器 对于某些类型的数据,例如文本数据,必须应用特征提取步骤将其转换为数值特征。 为了说明,我们加载我们之前使用的 SMS 垃圾邮件数据集。 import os with open(os.path.join("datasets", "smsspam", "SMSSpamCollection")) as

  • 本文向大家介绍设计模式构建器模式/Java 实现,包括了设计模式构建器模式/Java 实现的使用技巧和注意事项,需要的朋友参考一下 示例 通过Builder模式,您可以以易于阅读的方式创建具有许多可选变量的类的实例。 考虑以下代码: 如果所有参数都是必需的,那么一切都很好。如果有更多的变量和/或其中一些是可选的怎么办?您不想使用必需参数和可选参数的每种可能的组合来创建大量的构造函数,因为它变得难以

  • 各大设计模式例子参考:CSDN专栏 . C++ 设计模式 系列博文 设计模式工程目录 单例模式 单例模式例子 抽象工厂模式 抽象工厂模式例子 适配器模式 适配器模式例子 桥接模式 桥接模式例子 观察者模式 观察者模式例子 设计模式的六大原则 单一职责原则(SRP,Single Responsibility Principle) 里氏替换原则(LSP,Liskov Substitution Prin

  • 一、概述 二、创建型 1. 单例(Singleton) 2. 简单工厂(Simple Factory) 3. 工厂方法(Factory Method) 4. 抽象工厂(Abstract Factory) 5. 生成器(Builder) 6. 原型模式(Prototype) 三、行为型 1. 责任链(Chain Of Responsibility) 2. 命令(Command) 3. 解释器(Int

  • 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 本教程将通过 Java 实例,一步一步向您讲解设计模式的概念。 现在开始学习设计模式! 谁适合阅读本教程? 无论您是新手,还是老手,本教程都值得一读。对于那些

  • 设计模式是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。 设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案。面向对象设计模式通常以类或对象来描述其中的关系和相互作用,但不涉及用来完成应用程序的特定类或对象。设计模式能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力。 目录 创建型 ​构造函数