过滤对象的设计模式

时间:2014-09-30 13:02:14

标签: java design-patterns

我有一个将被过滤的对象列表。

此过滤将包含至少3个规则。

例如:

public class Filtering {

List<MyObject> myObjectList;

List<MyObject> filterStep1(List<MyObject> myObjectList){

    for(Myobject myobj : myObjectList){
        if(isCriteriaSatisified){
            continue
        }
        else {
            removeThisObjectFromList
        }
    }
}


List<MyObject> filterStep2(List<MyObject> myObjectList){

    for(Myobject myobj : myObjectList){
        if(isCriteriaSatisified){
            continue
        }
        else {
            removeThisObjectFromList
        }
    }
}

}

我喜欢这种方法,因为它简单,自包含,可以很容易地看到想要实现的目标。

但也许我应该使用一种设计模式呢?

责任链&#34;模式是我考虑filterStep1&amp; amp;上面代码中的filterStep2将被重构为一个单独的错误。

2 个答案:

答案 0 :(得分:4)

这是&#34;管道和过滤器&#34;模式,虽然您的实现没问题,但最好不要在方法中对过滤逻辑进行硬编码。相反,为每个布尔条件(Java 8中内置的条件或Guava中的条件)写一个Predicate<MyObject>。这更容易测试,并且可以轻松应用于现有的干净API,例如Streams API或Guava的集合视图。

答案 1 :(得分:2)

使用Java 8流的一个选项:

myObjects.stream().filter( this::isCriteriaSatisified ).filter( this::anotherCriteria )

假设您的班级中有boolean isCriteriaSatisified(myObj)方法。然后,您可以将该流收集到另一个列表中。