Паттерн «Перехватывающий фильтр»

Паттерн перехватывающего фильтра используется для выполнения некоторой предварительной/последующей обработки запроса или ответа приложения. Определите фильтры и примените их к запросу перед передачей его фактическому целевому приложению. Фильтры могут выполнять аутентификацию/авторизацию/логирование или отслеживать запрос, а затем передавать запрос соответствующему обработчику. Ниже приведены сущности этого паттерна проектирования.

  • Filter- Фильтр выполняет определенные задачи до или после того, как обработчик запроса выполнит запрос.
  • Цепочка фильтров- Цепочка фильтров содержит несколько фильтров и выполняет их на целевом объекте в заданном порядке.
  • Целевой объект- Целевой объект является обработчиком запроса.
  • Менеджер фильтров (Filter Manager)- Менеджер фильтров управляет фильтрами и цепочкой фильтров.
  • Клиент- Клиент — это объект, который отправляет запрос целевому объекту.

summary

назначение

Используется для предварительной и последующей обработки запроса через серию фильтров, прежде чем он достигнет конечного пункта назначения.

Основная решаемая проблема

  • Решает проблему необходимости выполнения общих операций (таких как логирование, проверки безопасности, управление транзакциями и т. д.) до и после обработки запроса в веб-приложениях.

Сценарий использования

  • Когда необходимо вставить дополнительную логику в поток обработки запроса, и эта логика не связана с бизнес-логикой.

Подход к реализации

  • Цепочка фильтров: Серия фильтров выполняется в определённом порядке.
  • Фильтр: Компоненты, которые выполняют предварительную и последующую обработку запросов и ответов.
  • Целевой объектКонечный пункт назначения обработки запроса.

Ключевой код

  • Интерфейс фильтра: Определяет методы, которые фильтры должны реализовать, такие какbefore()иafter()。
  • Конкретный фильтр: реализует интерфейс фильтра и содержит конкретную логику обработки.
  • Менеджер фильтров: отвечает за поддержание цепочки фильтров и порядок вызова фильтров.

Пример приложения

  • Сервер веб-приложений: например, Tomcat использует фильтры для перехвата и обработки запросов, таких как проверка прав, журналирование и т. д.

Преимущества

  1. Разделение ответственности: отделяет общие операции от бизнес-логики, повышая сопровождаемость кода.
  2. Расширяемость: фильтры можно гибко добавлять, удалять или изменять.
  3. Повторное использование: фильтры можно повторно использовать в различных процессах обработки запросов.

Недостатки

  • Влияние на производительность: если цепочка фильтров слишком длинная или выполняемые фильтрами операции сложны, производительность может пострадать.

Рекомендации по использованию

  • Когда нужно вставить общие операции, не связанные с бизнес-логикой, в поток обработки запросов, рассмотрите использование паттерна перехватывающего фильтра.

Примечания

  • Убедитесь, что порядок выполнения фильтров соответствует ожиданиям, чтобы избежать логических ошибок.

Основные задействованные роли

  1. Интерфейс фильтра:

    • Определяет методы, которые должны реализовать фильтры.
  2. Конкретный фильтр:

    • Реализует интерфейс фильтра, содержащий конкретную логику обработки.
  3. Менеджер фильтров:

    • Отвечает за поддержание цепочки фильтров и вызов фильтров.
  4. Целевой объект:

    • Конечный пункт назначения обработки запроса, реализация бизнес-логики.
  5. Клиент (необязательно):

    • Веб-браузер или API-клиент, отправляющий запрос.

Шаблон «Перехватывающий фильтр» помогает сохранять бизнес-логику ясной и целенаправленной, вставляя общие операции в поток обработки запросов.


Реализация

Мы создадимFilterChain、FilterManager、Target、ClientРазличные объекты, выступающие в качестве сущностей представления.AuthenticationFilterиDebugFilterПредставляют фильтр-сущность.

InterceptingFilterDemoИспользование классаClientДля демонстрации шаблона проектирования «Перехватывающий фильтр».

拦截过滤器模式的 UML 图

Шаг 1

Создайте интерфейс Filter.

Filter.java

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

Шаг 2

Создайте фильтр сущности.

AuthenticationFilter.java

public class AuthenticationFilter implements Filter { public void execute(String request){ System.out.println("Аутентификация запроса: " + request); } }

DebugFilter.java

public class DebugFilter implements Filter { public void execute(String request){ System.out.println("журнал запросов: " + request); } }

Шаг 3

Создать Target.

Target.java

public class Target { public void execute(String request){ System.out.println("Выполнение запроса: " + request); } }

Шаг 4

Создать цепочку фильтров.

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

Шаг 5

Создайте менеджер фильтров.

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

Шаг 6

Создайте клиент Client.

Client.java

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

Шаг 7

ИспользованиеClientЧтобы продемонстрировать шаблон проектирования «Перехватывающий фильтр».

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

Шаг 8

Выполните программу и выведите результат:

Authenticating request: HOME
request log: HOME
Executing request: HOME
Другие расширения