gpt4 book ai didi

java - 设计实现过滤链

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:51:17 24 4
gpt4 key购买 nike

我必须设计像过滤器这样的实体,由 Filter 接口(interface)表示,声明 apply(Content content) 方法,它可以应用于 Content 对象。过滤器可以以链的形式组合在一起,类似于工作流,但它们是动态的。例如,如果 FilterA 返回 X,那么我将应用 filterB,而接收结果 Y 将导致应用 FilterC。过滤器链是特定于应用程序的,我还没有决定如何允许构建过滤器链。

我会以与某些工作流框架相同的方式设计此行为:管理器组件迭代过滤器列表,并在每个过滤器上调用 filter.apply(content)。但是如何允许像 if/else 语句这样的动态性呢?

现在我设想了一个 Workflow 或 FilterChain 接口(interface),声明了一个 getNextFilter(previousResult)。实现此接口(interface)可以声明特定于应用程序的工作流。但是 Workflow 接口(interface)的实现会很无聊:跟踪当前步骤(整数?),然后在每次 getNextFilter() 调用时,通过 switch/case 确定下一个过滤器声明?!?

哪种解决方案更好?如何声明链?

我正在使用 Java 和 Spring,所以可以使用 IoC。

最佳答案

对于这种情况,我会尝试对链进行建模,并通过为节点提供更多“智能”来将执行责任转移到链本身。在某种程度上,我会将节点视为命令,因为它们可以自行执行,并且通过具有公共(public)接口(interface),能够创建 composites。 . (顺便说一句,我不是 Java 程序员,所以请原谅我可能出现的语法错误)。因此,我的主要设计决策是:

  1. 链知道如何 self 执行。
  2. 链节点可以是复合的。

我会先定义如下内容:

public abstract class ChainNode {
public abstract Content apply(Content content);
}

/**
The NullObject of the chain
http://www.oodesign.com/null-object-pattern.html
*/
public class FinalNode extends ChainNode {
public Content apply(Content content) {
return content;
}
}

/** A sample filter */
public class FilterA extends ChainNode {
private ChainNode nextNode;

FilterA(ChainNode nextNode) {
this.nextNode = nextNode;
}

public Content apply(Content content) {
filteredValue = //Apply the filter
return nextNode.apply(filteredValue);
}
}

/** An if-then-else filter */
public abstract class ConditionalFilter extends ChainNode {
private ChainNode trueFilter;
private ChainNode falseFilter;

ConditionalFilter(ChainNode trueFilter, ChainNode falseFilter) {
this.trueFilter = trueFilter;
this.falseFilter = falseFilter;
}

public Content apply(Content content) {
if (this.evalCondition(content)) {
return this.trueFilter.apply(content);
}
else {
return this.falseFilter.apply(content);
}
}

private abstract boolean evalCondition(Content content);
}

通过这种方法,您所做的是将控制结构转换为对象并要求它们执行,这甚至允许您创建不同于标准 if-then 或 switch 语句的逻辑。有了这个基础,您可以创建一个具有不同分支运算符的链,触发不同的过滤路径。

一些需要注意的事情是:

  1. 我假设过滤器返回类型为 Content 的内容,这实际上允许您将一个过滤器链接到另一个过滤器。我猜你的要求是正确的,但我不确定。
  2. 对于每个新过滤器,您只需创建一个新类并定义apply 方法。
  3. 空对象始终是链的最后一个节点,停止链调用。
  4. 要定义一个新的“分支节点”,您必须继承 ConditionalFilter 并重新定义 evalCondition 方法。我不知道 Java 是否有闭包(我认为没有),但如果有,您可以添加一个 condition 实例变量并使用闭包对其进行参数化,从而避免为每个新的子类化健康)状况。或者,对于 Java 世界中的此类事情,也许有更容易接受的解决方法,我只是不知道 :(。
  5. 我假设条件分支是根据content 参数决定的。如果您需要更多信息来做出决定,您还可以在 apply 方法中传递一个上下文对象。根据您的需要,这可以是结构化对象,如果您需要更大的灵 active ,也可以只是字典。

最后,关于链条的构造,如果链条又长又复杂,我认为 builder这里应该适合您的需要。

HTH

关于java - 设计实现过滤链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14553130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com