设计实现过滤链

use*_*028 5 java oop spring design-patterns

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

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

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

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

我使用的是Java和Spring,所以可以使用IoC。

Mic*_*ael 0

由于您只想按顺序执行过滤器链,因此将过滤器链实现为List<Filter>. 您可以对它们进行循环并执行。类似的东西(请注意,这显然是我没有尝试过的快速实现):

public class FilterChainImpl implements FilterChain {
  private List<Filter> filterChain = new ArrayList<Filter>();

  public addFilter(final Filter f) {
    filterChain.add(f);
  }

  public apply(final Content content) {
    Content prevContent = content;
    for(Filter f : filterChain) {
      prevContent = f.apply(prevContent);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用它来创建您喜欢的任何过滤器链。如果您将拥有许多不同的过滤器链,您可以使用一些工厂技术来创建过滤器链。