2014-09-30 96 views
5

我有一個將被過濾的對象列表。過濾對象的設計模式

此過濾將包含至少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 
     } 
    } 
} 

} 

我喜歡這種方法,因爲它很簡單,自包含的,可以看得很輕鬆什麼努力來實現。

但也許有一種設計模式,我應該使用呢?

「責任鏈」模式是我正在考慮的地方,filterStep1 & filterStep2在上面的代碼將被重構爲一個單獨的手柄。

+1

您可以考慮Java8的Stream API,它爲Collection對象提供了很好的過濾選項。 – 2014-09-30 13:06:30

+1

這個問題比Stack Overflow更適合[Code Review](http://codereview.stackexchange.com/)。 – ZeroOne 2014-09-30 13:07:14

+1

只有一句話:您正在修改原始列表。我所稱的過濾將會生成一個僅包含有效元素而不修改原始列表的新列表。 – 2014-09-30 13:29:48

回答

4

這是「管道和過濾器」模式,雖然你的實現沒問題,但最好不要在方法中硬編碼過濾邏輯。相反,寫一個Predicate<MyObject>爲您的每個布爾條件(無論是內置於Java 8或從番石榴)。這測試起來更容易,並且可以很容易地應用於現有的清潔API,例如Streams API或Guava的集合視圖。

+0

我同意使用函數進行過濾非常簡潔,但我無法使用Java8 API。所以我會用我提出的選項。謝謝 – 2014-10-01 12:16:55

+0

@ blue-sky查看Guava作爲實現該模式的選項。 – chrylis 2014-10-01 21:02:37

2

一個使用Java的選項8流:

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

假設你已經在你的類中的方法boolean isCriteriaSatisified(myObj)。然後,您可以將該流收集到另一個列表中。