No has dicho si los filtros toman algún parámetro. Por ejemplo, filter_A
podría ser un filtro de categoría, por lo que no es solo una cuestión de "¿necesito aplicar filter_A
", podría ser "necesito aplicar filter_A
y devolver todos los registros con la categoría campo = fooCategory
".
La forma más sencilla de implementar exactamente lo que has descrito (pero asegúrate de leer la segunda mitad de la respuesta a continuación) es similar a las otras respuestas, pero no tendría ningún booleano. cheques en absoluto Definiría interfaces: FilterA, FilterB, FilterC
. Entonces puedes tener algo como (soy un programador de Java, así que esta será la sintaxis de Java):
class RequestFilters {
FilterA filterA;
FilterB filterB;
FilterC filterC;
}
Entonces podrías tener algo como esto (usando enum patrón de singleton de Java efectivo ):
enum NoOpFilterA implements FilterA {
INSTANCE;
public List<Item> applyFilter(List<Item> input) {
return input;
}
}
Pero si realmente quieres filtrar algunos elementos, puedes proporcionar una instancia de una implementación FilterA
que realmente haga algo. Tu método de filtración será muy simple
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;
}
Pero acabo de empezar.
Sospecho que la llamada applyFilter
será en realidad bastante similar para los tres tipos de filtros. Si ese es el caso, ni siquiera lo haría de la manera descrita anteriormente. Puede obtener un código aún más claro si solo tiene una interfaz, y luego haga esto:
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;
}
}
Luego, a medida que su usuario navega por las páginas, simplemente agrega una nueva instancia de cualquier filtro que necesite cuando sea apropiado. Esto le permitirá poder aplicar múltiples instancias del mismo filtro con diferentes argumentos en caso de que necesite ese comportamiento en el futuro, y también agregar filtros adicionales en el futuro sin tener que cambiar su diseño .
Además, puedes agregar algo como el NoOpFilter
anterior o simplemente no puedes agregar un filtro en particular a la lista, lo que sea más fácil para tu código.