2014-09-30 3 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

Вы можете рассмотреть API потока Java8, который обеспечивает отличные параметры фильтрации для объектов Collection. –

+1

Этот вопрос будет гораздо лучше подходит для [Code Review] (http://codereview.stackexchange.com/), чем для переполнения стека. – ZeroOne

+1

Только одно замечание: вы изменяете исходные списки. То, что я называю фильтрацией, было бы создание нового списка, содержащего только допустимые элементы без изменения исходного списка. –

ответ

4

Это шаблон «трубы и фильтры», и, хотя ваша реализация в порядке, лучше не жестко кодировать логику фильтрации в методах. Вместо этого напишите Predicate<MyObject> для каждого из ваших логических условий (либо встроенного в Java 8, либо из Guava). Это намного проще в тестировании и может быть легко применено к существующим чистым API-интерфейсам, таким как представления Streams API или Guava.

+0

Я согласен, что функции для фильтрации намного чище, но я не могу использовать Java8 API. Поэтому я буду использовать предложенную вами опцию. Спасибо –

+0

@ blue-sky Посмотрите на Guava как вариант для реализации шаблона. – chrylis

2

Один вариант с использованием Java 8 потоков:

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

Если предположить, что у вас есть метод boolean isCriteriaSatisified(myObj) в своем классе. Затем вы можете собрать этот поток в другой список.

Смежные вопросы