Patrón de filtro interceptor

El preprocesamiento y el posprocesamiento de una solicitud se refieren a las acciones realizadas antes y después del procesamiento principal de esa solicitud. Algunas de estas acciones determinan si el procesamiento continuará, mientras que otras manipulan el flujo de datos entrantes o salientes en una forma adecuada para un procesamiento posterior.

La solución clásica consiste en una serie de comprobaciones condicionales, en las que cualquier comprobación fallida cancela la solicitud. Las declaraciones if/else anidadas son una estrategia estándar, pero esta solución conduce a la fragilidad del código y a un estilo de programación de copiar y pegar, porque el flujo del filtrado y la acción de los filtros se compilan en la aplicación.
La clave para resolver este problema de manera flexible y discreta es tener un mecanismo simple para agregar y quitar componentes de procesamiento, en el que cada componente complete una acción de filtrado específica.

Diagrama UML que intercepta el patrón de filtro

Componentes de diseño

  • Filter Manager: FilterManager gestiona el procesamiento de filtros. Crea FilterChain con los filtros adecuados, en el orden correcto, e inicia el procesamiento.
  • FilterChain: FilterChain es una colección ordenada de filtros independientes.
  • FilterOne, FilterTwo: estos son los filtros individuales que se asignan a un objetivo. FilterChain coordina su procesamiento.
  • Target: El Target es el recurso solicitado por el cliente.

Veamos un ejemplo de patrón de filtro interceptor.

// Java program to illustrate
// Intercepting Filter Pattern
import java.util.ArrayList;
import java.util.List;
  
interface Filter 
{
    public void execute(String request);
}
  
class AuthenticationFilter implements Filter 
{
    public void execute(String request)
    {
        System.out.println("Authenticating : " + request);
    }
}
  
class DebugFilter implements Filter 
{
    public void execute(String request)
    {
        System.out.println("Log: " + request);
    }
}
  
class Target 
{
    public void execute(String request)
    {
        System.out.println("Executing : " + request);
    }
}
  
class FilterChain 
{
    private List<Filter> filters = new ArrayList<Filter>();
    private Target target;
  
    public void addFilter(Filter filter)
    {
        filters.add(filter);
    }
  
    public void execute(String request)
    {
        for (Filter filter : filters) 
        {
            filter.execute(request);
        }
        target.execute(request);
    }
  
    public void setTarget(Target target)
    {
        this.target = target;
    }
}
  
class FilterManager 
{
    FilterChain filterChain;
  
   public FilterManager(Target target)
   {
       filterChain = new FilterChain();
        filterChain.setTarget(target);
   }
   public void setFilter(Filter filter)
   {
       filterChain.addFilter(filter);
   }
  
   public void filterRequest(String request)
   {
       filterChain.execute(request);
   }
}
  
class Client 
{
    FilterManager filterManager;
  
    public void setFilterManager(FilterManager filterManager)
    {
        this.filterManager = filterManager;
          
    }
  
    public void sendRequest(String request)
    {
        filterManager.filterRequest(request);
    }
}
  
class InterceptingFilter
{
    public static void main(String[] args) 
    {
        FilterManager filterManager = new FilterManager(new Target());
        filterManager.setFilter(new AuthenticationFilter());
        filterManager.setFilter(new DebugFilter());
  
        Client client = new Client();
        client.setFilterManager(filterManager);
        client.sendRequest("Downloads");
          
    }
}

Producción:

Authenticating : Downloads
Log: Downloads
Executing : Downloads

ventajas :

  • Reutilización mejorada: el código común está centralizado en componentes conectables que mejoran la reutilización.
  • Mayor flexibilidad: los componentes comunes genéricos se pueden aplicar y eliminar de forma declarativa, lo que mejora la flexibilidad.

Desventajas:

  • El intercambio de información es ineficiente para interceptar patrones.

Este artículo es una contribución de Saket Kumar . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *