您还没有说过滤器是否带有任何参数。例如,filter_A
可能是类别过滤器,所以它不仅是“我需要应用filter_A
”的问题,还可能是“我需要应用filter_A
并返回类别字段= fooCategory
”的所有记录。
完全实现您所描述的内容的最简单方法(但请确保阅读下面的答案的后半部分)与其他答案类似,但是我根本不会进行布尔检查。我将定义接口:FilterA, FilterB, FilterC
。然后,您可能会得到类似(我是Java程序员,所以这将是Java风格的语法):
class RequestFilters {
FilterA filterA;
FilterB filterB;
FilterC filterC;
}
然后,您可能会遇到这样的事情(使用来自Effective Java的枚举单例模式):
enum NoOpFilterA implements FilterA {
INSTANCE;
public List<Item> applyFilter(List<Item> input) {
return input;
}
}
但是,如果您实际上希望过滤某些项目,则可以提供FilterA
实际执行某项操作的实现实例。您的过滤方法将非常简单
List<Item> filterItems(List<Item> data, RequestFilters filters) {
List<Item> returnedList = data;
returnedList = filters.filterA.filter(data);
returnedList = filters.filterB.filter(data);
returnedList = filters.filterC.filter(data);
return returnedList;
}
但是我才刚刚开始。
我怀疑这applyFilter
三种过滤器的调用实际上都非常相似。如果真是这样,我什至不会以上述方式进行。通过仅具有一个接口,您可以得到更简洁的代码,然后执行以下操作:
class ChainedFilter implements Filter {
List<Filter> filterList;
void addFilter(Filter filter) {
filterList.add(filter);
}
List<Item> applyFilter(List<Item> input) {
List<Item> returnedList = input;
for(Filter f : filterList) {
returnedList = f.applyFilter(returnedList);
}
return returnedList;
}
}
然后,当用户浏览页面时,您只需要在需要时添加所需过滤器的新实例即可。这将使您能够在将来需要该行为的情况下,将同一过滤器的多个实例应用不同的参数,并在将来添加其他过滤器而无需更改设计。
另外,您可以添加NoOpFilter
上述类似内容,也可以根本不添加特定的过滤器,这对您的代码来说更容易。