Patrón de filtro
El patrón de filtro (Filter Pattern) o patrón de criterio (Criteria Pattern) es un patrón de diseño que permite a los desarrolladores utilizar diferentes criterios para filtrar un grupo de objetos, conectándolos mediante operaciones lógicas de forma desacoplada. Este tipo de patrón de diseño pertenece a los patrones estructurales, y combina múltiples criterios para obtener un único criterio.
Resumen
Intención
Se utiliza para encapsular el proceso de filtrado de objetos, permitiendo filtrar objetos dinámicamente con diferentes criterios de filtrado.
Problema principal que resuelve
Cuando es necesario filtrar un grupo de objetos según múltiples condiciones o criterios diferentes, el patrón de filtro proporciona una forma flexible de definir estas condiciones, evitando codificar de manera fija la lógica de filtrado en el código del cliente.
Escenarios de uso
- Cuando una colección de objetos necesita filtrarse según diferentes criterios.
- Cuando la lógica de filtrado puede cambiar, o es necesario combinar dinámicamente múltiples condiciones de filtrado.
Forma de implementación
- Definir la interfaz de filtrado: crear una interfaz de filtrado y definir un método de filtrado.
- Implementar filtros concretos: implementar la interfaz de filtrado para cada criterio de filtrado, encapsulando la lógica de filtrado específica.
- Combinar filtros: permitir la combinación entre filtros para formar una lógica de filtrado compleja.
Código clave
- Interfaz de filtrado: definir el método de filtrado, como
matches()。 - Clases de filtro concretas: implementan la interfaz de filtrado y encapsulan la lógica de filtrado específica.
- Filtro combinado: implementa la lógica de combinación de filtros, como AND (lógica AND), OR (lógica OR), etc.
Ejemplos de aplicación
- Sistema de gestión de bibliotecas: filtrar libros según diferentes criterios como autor, año de publicación, categoría, etc.
- Plataforma de compras en línea: filtrar productos según condiciones como precio, marca, valoración de usuarios, etc.
Ventajas
- Encapsulamiento: la lógica de filtrado se encapsula en objetos de filtro independientes.
- Flexibilidad: se pueden agregar, modificar o combinar condiciones de filtrado dinámicamente.
- Extensibilidad: es fácil agregar nuevos criterios de filtrado sin modificar el código existente.
Desventajas
- Complejidad: el sistema puede volverse complejo a medida que aumentan las condiciones de filtrado.
- Problemas de rendimiento: si la combinación de filtros es demasiado compleja, puede afectar el rendimiento.
Recomendaciones de uso
- Cuando la lógica de filtrado pueda cambiar o se necesite filtrar objetos dinámicamente según diferentes criterios, considere usar el patrón de filtro.
- Al diseñar, asegúrese de que la interfaz y la implementación del filtro sean coherentes para facilitar la combinación y la extensión.
Consideraciones
- Asegúrese de que la lógica de combinación de filtros sea correcta para evitar introducir errores lógicos.
- Al implementar, tenga en cuenta el impacto en el rendimiento, especialmente al manejar grandes volúmenes de datos.
Resumen
El patrón de filtro incluye los siguientes roles principales:
Interfaz de filtro (Filter/Criteria): define una interfaz para filtrar objetos. Esta interfaz suele contener un método para filtrar objetos según condiciones específicas.
Clase de filtro concreta (Concrete Filter/Concrete Criteria): implementa la interfaz de filtro y define concretamente las condiciones y la lógica para filtrar objetos.
Colección de objetos (Items/Objects to be filtered): la colección de objetos que se va a filtrar. Estos objetos suelen ser instancias con atributos comunes, por ejemplo, un grupo de personas, un grupo de productos, etc.
Cliente (Client): usa las clases de filtro concretas para filtrar la colección de objetos. El cliente combina la colección de objetos y los filtros para obtener los objetos que cumplen las condiciones.
Implementación
Crearemos unPersonobjeto,Criteriainterfaz y clases de entidad que implementan dicha interfaz para filtrarPersonla lista de objetos.CriteriaPatternDemoLa clase utilizaCriteriaobjetos, basándose en varios criterios y sus combinaciones para filtrarPersonla lista de objetos.
Paso 1
Crear una clase sobre la que se aplicarán los criterios.
Person.java
Paso 2
Crear una interfaz para el criterio (Criteria).
Criteria.java
Paso 3
CrearCriterialas clases de entidad que implementan la interfaz.
CriteriaMale.java
CriteriaFemale.java
CriteriaSingle.java
AndCriteria.java
OrCriteria.java
Paso 4
Usar diferentes criterios (Criteria) y sus combinaciones para filtrarPersonla lista de objetos.
CriteriaPatternDemo.java
Paso 5
Ejecutar el programa y mostrar el resultado:
Males: Person : [ Name : Robert, Gender : Male, Marital Status : Single ] Person : [ Name : John, Gender : Male, Marital Status : Married ] Person : [ Name : Mike, Gender : Male, Marital Status : Single ] Person : [ Name : Bobby, Gender : Male, Marital Status : Single ] Females: Person : [ Name : Laura, Gender : Female, Marital Status : Married ] Person : [ Name : Diana, Gender : Female, Marital Status : Single ] Single Males: Person : [ Name : Robert, Gender : Male, Marital Status : Single ] Person : [ Name : Mike, Gender : Male, Marital Status : Single ] Person : [ Name : Bobby, Gender : Male, Marital Status : Single ] Single Or Females: Person : [ Name : Robert, Gender : Male, Marital Status : Single ] Person : [ Name : Diana, Gender : Female, Marital Status : Single ] Person : [ Name : Mike, Gender : Male, Marital Status : Single ] Person : [ Name : Bobby, Gender : Male, Marital Status : Single ] Person : [ Name : Laura, Gender : Female, Marital Status : Married ]Otras extensiones