Patron Filtre Intercepteur

Le modèle de filtre d'interception est utilisé pour effectuer un pré-traitement/post-traitement sur une requête ou une réponse d'une application. Définissez des filtres et appliquez-les sur la requête avant de la transmettre à l'application cible réelle. Les filtres peuvent effectuer une authentification/une autorisation/une journalisation, ou suivre la requête, puis transmettre la requête au gestionnaire correspondant. Voici les entités de ce modèle de conception.

  • Filter- Le Filter effectue certaines tâches avant ou après que le gestionnaire de requêtes exécute la requête.
  • Chaîne de filtres- La chaîne de filtres contient plusieurs filtres et les exécute sur la cible dans l'ordre défini.
  • Cible- L'objet cible est le gestionnaire de la requête.
  • Gestionnaire de filtres (Filter Manager)- Le gestionnaire de filtres gère les filtres et la chaîne de filtres.
  • Client- Le client est l'objet qui envoie la requête à l'objet cible.

summary

intention

Utilisé pour prétraiter et post-traiter la requête via une série de filtres avant qu'elle n'atteigne la destination finale.

Problème principal résolu

  • Résout le problème consistant à devoir effectuer des opérations courantes (telles que la journalisation, les contrôles de sécurité, la gestion des transactions, etc.) avant et après le traitement des requêtes dans les applications Web.

Cas d'utilisation

  • Lorsqu'il est nécessaire d'insérer une logique supplémentaire dans le flux de traitement des requêtes, et que cette logique est indépendante de la logique métier.

Approche d'implémentation

  • Chaîne de filtres: Une série de filtres s'exécute dans un ordre spécifique.
  • Filtre: Composants qui effectuent un prétraitement et un post-traitement sur les requêtes et les réponses.
  • Objet cibleLa destination finale du traitement de la requête.

Code clé

  • Interface de filtre: Définit les méthodes que les filtres doivent implémenter, telles quebefore()etafter()。
  • Filtre concret: Implémente l'interface de filtre et contient une logique de traitement spécifique.
  • Gestionnaire de filtres: Responsable du maintien de la chaîne de filtres et de l'ordre d'invocation des filtres.

Exemple d'application

  • Serveur d'applications web: Par exemple, Tomcat utilise des filtres pour le traitement d'interception des requêtes, comme les contrôles de permissions, la journalisation, etc.

Avantages

  1. Séparation des préoccupations: Sépare les opérations communes de la logique métier, ce qui améliore la maintenabilité du code.
  2. Extensibilité: Les filtres peuvent être ajoutés, supprimés ou modifiés de manière flexible.
  3. Réutilisabilité: Les filtres peuvent être réutilisés dans différents traitements de requêtes.

Inconvénients

  • Impact sur les performances: Si la chaîne de filtres est trop longue ou si les opérations effectuées par les filtres sont complexes, les performances peuvent être affectées.

Suggestions d'utilisation

  • Lorsque vous devez insérer des opérations communes sans lien avec la logique métier dans le flux de traitement des requêtes, envisagez d'utiliser le modèle de filtre d'interception.

Notes

  • Assurez-vous que l'ordre d'exécution des filtres correspond aux attentes afin d'éviter les erreurs de logique.

Principaux rôles impliqués

  1. Interface de filtre:

    • Définit les méthodes que les filtres doivent implémenter.
  2. Filtre concret:

    • Implémente l'interface de filtre, contenant une logique de traitement spécifique.
  3. Gestionnaire de filtres:

    • Responsable de maintenir la chaîne de filtres et d'invoquer les filtres.
  4. Objet cible:

    • La destination finale du traitement des requêtes, l'implémentation de la logique métier.
  5. Client (facultatif):

    • Le navigateur Web ou le client API qui envoie la requête.

Le modèle de conception Intercepting Filter permet de garder la logique métier claire et concentrée en insérant des opérations courantes dans le flux de traitement des requêtes.


Implémentation

Nous allons créerFilterChain、FilterManager、Target、ClientDivers objets agissant comme entités de représentation.AuthenticationFilteretDebugFilterReprésentent le filtre d'entité.

InterceptingFilterDemoUtilisation de la classeClientPour démontrer le modèle de conception Intercepting Filter.

拦截过滤器模式的 UML 图

Étape 1

Créer l'interface Filter.

Filter.java

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

Étape 2

Créer un filtre d'entité.

AuthenticationFilter.java

public class AuthenticationFilter implements Filter { public void execute(String request){ System.out.println("Authentification de la requête : " + request); } }

DebugFilter.java

public class DebugFilter implements Filter { public void execute(String request){ System.out.println("journal des requêtes : " + request); } }

Étape 3

Créer Target.

Target.java

public class Target { public void execute(String request){ System.out.println("Exécution de la requête : " + request); } }

Étape 4

Créer la chaîne de filtres.

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

Étape 5

Créer un gestionnaire de filtres.

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

Étape 6

Créer un client Client.

Client.java

public class Client { FilterManager filterManager; public void setFilterManager(FilterManager filterManager){ this.filterManager = filterManager; } public void sendRequest(String request){ filterManager.filterRequest(request); } }

Étape 7

UtilisationClientPour démontrer le patron de conception Intercepting Filter.

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

Étape 8

Exécutez le programme et affichez le résultat :

Authenticating request: HOME
request log: HOME
Executing request: HOME
autres extensions