Patrón de diseño "Patrón de filtro"

¿Qué es el patrón de filtro?

El patrón de filtro es un patrón de diseño estructural que le permite procesar cadenas de objetos utilizando diferentes criterios (filtros) para conectar solicitudes a procesos. El modo de filtro es útil cuando necesita filtrar objetos por diferentes condiciones de filtro.

Por qué usar el patrón de filtro

El uso del modo de filtro puede hacernos más flexibles y convenientes cuando operamos en colecciones de objetos. Puede filtrar objetos dinámicamente de acuerdo con diferentes condiciones de filtro y devolver la colección de objetos filtrados. Además, el modo de filtro también puede ayudarnos a reducir el acoplamiento del código, haciendo que el código sea más conciso y fácil de mantener.

¿Dónde lo usas en el trabajo?

En Android, el modo de filtro generalmente se usa para manejar el filtrado de datos en controles de lista como ListView y RecyclerView. Por ejemplo, podemos filtrar los datos en la lista a través de las palabras clave ingresadas por el usuario, o filtrar los datos según algunos atributos de los datos. Además, hay algunas bibliotecas en Android, como RxJava, que también brindan la implementación del modo de filtro.

Ideas de diseño

En el patrón de filtro, definimos una interfaz Filter, que contiene un método filter(), que recibe una solicitud y devuelve una solicitud filtrada.

También necesitamos definir una clase FilterChain que mantenga una lista de filtros y proporcione un método addFilter() para agregar filtros. Cuando se pasa una solicitud a FilterChain, será procesada por el método filter() de cada filtro a su vez.

Finalmente, necesitamos definir una clase de Solicitud que contenga algunas propiedades que necesitamos filtrar. Cuando se usa en el lado del cliente, podemos crear un objeto de Solicitud y pasarlo a FilterChain para su procesamiento.

Implementación de código del patrón de filtro

El siguiente es un ejemplo de implementación de un patrón de filtro simple:
Primero, definimos la interfaz Filter:

public interface Filter {
    
    
    void filter(Request request, FilterChain filterChain);
}

Luego, definimos la clase FilterChain:

public class FilterChain {
    
    
    private List<Filter> filters = new ArrayList<>();
    private int index = 0;

    public FilterChain addFilter(Filter filter) {
    
    
        filters.add(filter);
        return this;
    }

    public void doFilter(Request request) {
    
    
        if (index >= filters.size()) {
    
    
            return;
        }
        Filter filter = filters.get(index);
        index++;
        filter.filter(request, this);
    }
}

A continuación, definimos la clase Request:

public class Request {
    
    
    private String keyword;
    private int price;

    public Request(String keyword, int price) {
    
    
        this.keyword = keyword;
        this.price = price;
    }

    public String getKeyword() {
    
    
        return keyword;
    }

    public int getPrice() {
    
    
        return price;
    }
}

Finalmente, definimos dos filtros:

public class KeywordFilter implements Filter {
    
    
    private String keyword;

    public KeywordFilter(String keyword) {
    
    
        this.keyword = keyword;
    }

    @Override
    public void filter(Request request, FilterChain filterChain) {
    
    
        if (request.getKeyword().contains(keyword)) {
    
    
            filterChain.doFilter(request);
        }
    }
}

public class PriceFilter implements Filter {
    
    
    private int maxPrice;

    public PriceFilter(int maxPrice) {
    
    
        this.maxPrice = maxPrice;
    }

    @Override
    public void filter(Request request, FilterChain filterChain) {
    
    
        if (request.getPrice() <= maxPrice) {
    
    
            filterChain.doFilter(request);
        }
    }
}

El cliente utiliza el patrón de filtro de la siguiente manera:

public static void main(String[] args) {
    
    
    Request request = new Request("phone", 1000);
    FilterChain filterChain = new FilterChain();
    filterChain.addFilter(new KeywordFilter("phone"))
            .addFilter(new PriceFilter(900));
    filterChain.doFilter(request);
}

En el código anterior, primero creamos un objeto Request y definimos dos filtros: KeywordFilter y PriceFilter. Luego, agregue estos dos filtros a FilterChain y llame al método doFilter() para filtrar la solicitud.

Resumir

El patrón de filtro es un patrón de diseño simple y práctico que puede ayudarnos a filtrar dinámicamente colecciones de objetos y reducir el acoplamiento de código. En el desarrollo de Android, el modo de filtro generalmente se usa para procesar el filtrado de datos de la lista, lo cual es muy práctico.

Supongo que te gusta

Origin blog.csdn.net/weixin_45112340/article/details/129811510
Recomendado
Clasificación