필터가 매개 변수를 사용하는지 여부는 말하지 않았습니다. 예를 들어, filter_A
범주 필터 일 filter_A
수 있으므로 " 적용해야합니까"라는 질문이 아니라 " filter_A
범주 필드 = fooCategory
"인 모든 레코드 를 적용 하고 반환 해야합니다 .
설명 한 것을 정확하게 구현하는 가장 간단한 방법 (그러나 아래 답변의 후반부를 읽으십시오) 은 다른 답변과 비슷하지만 부울 검사는 전혀하지 않습니다. 인터페이스를 정의 FilterA, FilterB, FilterC
합니다.. 그런 다음과 같은 것을 가질 수 있습니다 (저는 Java 프로그래머이므로 Java와 같은 구문입니다).
class RequestFilters {
FilterA filterA;
FilterB filterB;
FilterC filterC;
}
그럼 당신은 다음과 같이합니다 (사용 할 수 열거 싱글 톤 패턴 에서 효과적인 자바 ) :
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
위와 같은 것을 추가하거나 코드에 더 쉬운 모든 목록에 특정 필터를 전혀 추가 할 수 없습니다.