Non hai detto se i filtri prendono qualsiasi parametro. Ad esempio, filter_A
potrebbe essere un filtro di categoria, quindi non è solo una questione di "devo applicare filter_A
", potrebbe essere "Devo applicare filter_A
e restituire tutti i record con la categoria campo = fooCategory
".
Il modo più semplice per implementare esattamente quello che hai descritto (ma assicurati di leggere la seconda metà della risposta sotto) è simile alle altre risposte, ma non avrei alcun valore booleano controlli a tutti. Definirei le interfacce: FilterA, FilterB, FilterC
. Quindi puoi avere qualcosa di simile (io sono un programmatore Java, quindi questa sarà la sintassi Java-esque):
class RequestFilters {
FilterA filterA;
FilterB filterB;
FilterC filterC;
}
Quindi potresti avere qualcosa di simile a questo (usando il enum modello singleton di Java efficace ):
enum NoOpFilterA implements FilterA {
INSTANCE;
public List<Item> applyFilter(List<Item> input) {
return input;
}
}
Ma se in effetti desideri che alcuni elementi vengano filtrati, puoi invece fornire un'istanza di un'implementazione FilterA
che in realtà fa qualcosa. Il tuo metodo di filtraggio sarà molto semplice
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;
}
Ma ho appena iniziato.
Sospetto che la chiamata di applyFilter
sarà in realtà abbastanza simile per tutti e tre i tipi di filtri. Se è così, non lo farei nemmeno come descritto sopra. Puoi ottenere un codice ancora più pulito avendo solo un'interfaccia, quindi facendo questo:
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;
}
}
Quindi, mentre l'utente naviga tra le pagine, è sufficiente aggiungere una nuova istanza di qualsiasi filtro necessario, se necessario. Ciò ti consentirà di essere in grado di applicare più istanze dello stesso filtro con argomenti diversi nel caso in cui avessi bisogno di tale comportamento in futuro e di aggiungere ulteriori filtri in futuro senza dover modificare il tuo design .
Inoltre, puoi aggiungere qualcosa come NoOpFilter
sopra o non puoi semplicemente aggiungere un particolare filtro all'elenco, qualunque cosa sia più facile per il tuo codice.