java - 是否存在具有不同数量的输入/输出,但核心工作职责相同的模式?

标签 java design-patterns abstract-class abstraction

我的代码库中有一个模式看起来很像这样:我们正在处理来自队列的消息,然后将该消息传递到下一个队列。到目前为止的用例是我们处理和生成相同类型的消息。

public interface Processor<T> {
  T process(T thing);
}

该用例已演变为处理和生成不同类型的用例。此外,我们可能需要处理一种类型并生产一系列其他类型。

所以像:
public interface NewProcessor<I, O> {
  O process(I thing;)
}

并且将来可能需要类似的东西
public interface FutureProcessor<I, O1, O2> { //potentially N number of O
  Pair<O1, O2> process(I thing);
}

我的问题是:有没有办法比拥有三个单独的类更清晰地表达这种情况?我可以在这里使用一个很好的已知层次结构吗?

我们有第一种处理器的抽象用户,我希望每次添加新处理器时不必重新编写。它今天做了这样的事情:
public abstract AbstractModule<T> {
  private Processor<T> processor;
  public AbstractModule(Processor<T> processor) {
   this.processor = processor;
  }

  T runModule(T input) {
    // abstract validateInput(input);
    T result = processor.process();
    // record results
    return result;
  }
}

任何关于如何做到这一点的已知模式或建议将不胜感激!

最佳答案

你的用例是获取一个对象,用它做一些事情并生成一个新的。基本上是一个参数的函数。我认为关键部分是参数的数量,因为在 Java 中您只能返回一个结果。如果您确定将来不需要一次处理多个对象,那么没有更通用的方法可以使用您已经定义的函数(我会在以下情况下使用 JDK 的函数)虽然可能,在这种情况下 Function UnaryOperator )。

假设您想继续使用您的自定义函数并且您不想更改您的 AbstractModule如你所说。我会重命名 ProcessorUnaryProcessor至少。然后我将其更改如下:

public interface Processor<T, R> {
    R process(T t);
}
public interface UnaryProcessor<T> extends Processor<T, T> {}

此时,您将能够处理您提到的最后一个用例 Processor<T, Pair<O1, O2>> .相同的逻辑适用于任何 future 的用例,您只需要将返回类型替换为您当时需要的任何类型,例如 List<E> .

关于java - 是否存在具有不同数量的输入/输出,但核心工作职责相同的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61262535/

相关文章:

java - 使用 Android Studio 生成的 APK 未安装在某些设备上

c# - 静态类继承抽象类?

java - Thymeleaf 提交抽象类型的集合

c# - 需要一些帮助来解决我的 DAL 中的主要抽象模式问题

java - 生成没有随机类的 4 位数字

java - 在 Java 中,每个查询都应该在一个单独的线程中吗?

java - 如何限制 CDI 认为是托管 bean?

c++ - 寻找 child

c++ - 如何决定是否为窗口的小部件创建一个单独的类?

sql - 动态搜索多个sql表的需要模式