我的代码库中有一个模式看起来很像这样:我们正在处理来自队列的消息,然后将该消息传递到下一个队列。到目前为止的用例是我们处理和生成相同类型的消息。
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
如你所说。我会重命名 Processor
如 UnaryProcessor
至少。然后我将其更改如下:
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/