Padrão de Design - Padrão de Filtro de Interceptação

O padrão de design de filtro de interceptação é usado quando queremos fazer algum pré-processamento / pós-processamento com solicitação ou resposta do aplicativo. Filtros são definidos e aplicados na solicitação antes de passar a solicitação para o aplicativo de destino real. Os filtros podem fazer a autenticação / autorização / registro ou rastreamento da solicitação e, em seguida, passar as solicitações aos manipuladores correspondentes. A seguir estão as entidades desse tipo de padrão de design.

  • Filter - Filtro que realizará determinada tarefa antes ou depois da execução da solicitação pelo manipulador de solicitações.

  • Filter Chain - A Cadeia de Filtros carrega vários filtros e ajuda a executá-los em uma ordem definida no destino.

  • Target - O objeto de destino é o manipulador de solicitação

  • Filter Manager - Filter Manager gerencia os filtros e Filter Chain.

  • Client - Cliente é o objeto que envia a solicitação ao objeto Destino.

Implementação

Vamos criar um FilterChain , FilterManager , Target , Client como vários objetos que representam nossas entidades. AuthenticationFilter e DebugFilter representam filtros concretos.

InterceptingFilterDemo , nossa classe de demonstração, usará Client para demonstrar o padrão de design de filtro de interceptação.

Passo 1

Criar interface de filtro.

Filter.java

public interface Filter {
   public void execute(String request);
}

Passo 2

Crie filtros concretos.

AuthenticationFilter.java

public class AuthenticationFilter implements Filter {
   public void execute(String request){
      System.out.println("Authenticating request: " + request);
   }
}

DebugFilter.java

public class DebugFilter implements Filter {
   public void execute(String request){
      System.out.println("request log: " + request);
   }
}

etapa 3

Criar alvo

Target.java

public class Target {
   public void execute(String request){
      System.out.println("Executing request: " + request);
   }
}

Passo 4

Criar Cadeia de Filtros

FilterChain.java

import java.util.ArrayList;
import java.util.List;

public 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;
   }
}

Etapa 5

Criar Gerenciador de Filtros

FilterManager.java

public 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);
   }
}

Etapa 6

Criar Cliente

Client.java

public class Client {
   FilterManager filterManager;

   public void setFilterManager(FilterManager filterManager){
      this.filterManager = filterManager;
   }

   public void sendRequest(String request){
      filterManager.filterRequest(request);
   }
}

Etapa 7

Use o cliente para demonstrar o padrão de design de filtro de interceptação.

InterceptingFilterDemo.java

public class InterceptingFilterDemo {
   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("HOME");
   }
}

Etapa 8

Verifique a saída.

Authenticating request: HOME
request log: HOME
Executing request: HOME