Паттерн Фильтр
Шаблон фильтра или шаблон критериев — это шаблон проектирования, который позволяет разработчикам фильтровать набор объектов с использованием различных критериев и соединять их слабосвязанным способом посредством логических операций. Этот тип шаблонов проектирования относится к структурным шаблонам, поскольку он объединяет несколько критериев для получения единого стандарта.
summary
назначение
Используется для инкапсуляции процесса фильтрации объектов, позволяя динамически фильтровать объекты с использованием различных критериев фильтрации.
Основные решаемые проблемы
Когда набор объектов необходимо фильтровать на основе нескольких различных условий или критериев, шаблон фильтра предоставляет гибкий способ определения этих условий, избегая жесткого кодирования логики фильтрации в клиентском коде.
Сценарий использования
- Когда коллекцию объектов необходимо фильтровать по различным критериям.
- Когда логика фильтрации может измениться или когда несколько условий фильтрации необходимо динамически объединить.
Подход к реализации
- Определите интерфейс фильтра: Создайте интерфейс фильтра и определите метод фильтрации.
- Реализация конкретных фильтров: реализуйте интерфейс фильтра для каждого критерия фильтрации, инкапсулируя конкретную логику фильтрации.
- Составной фильтр: позволяет объединять фильтры для формирования сложной логики фильтрации.
Ключевой код
- Интерфейс фильтра: определите метод фильтрации, например
matches()。 - Класс конкретного фильтра: реализуйте интерфейс фильтра и инкапсулируйте конкретную логику фильтрации.
- Составной фильтр: реализуйте логику комбинирования фильтров, например логическое И, логическое ИЛИ и т. д.
Пример приложения
- Система управления книгами: фильтрация книг по различным критериям, таким как автор, год публикации и категория.
- Платформа онлайн-покупок: фильтрация товаров по таким условиям, как цена, бренд и пользовательский рейтинг.
Преимущества
- Инкапсуляция: логика фильтрации инкапсулирована в независимых объектах фильтров.
- Гибкость: условия фильтрации можно динамически добавлять, изменять или комбинировать.
- Расширяемость: новые критерии фильтрации можно легко добавлять без изменения существующего кода.
Недостатки
- Сложность: по мере увеличения количества условий фильтрации система может стать сложной.
- Проблемы с производительностью: если комбинация фильтров слишком сложна, производительность может снизиться.
Рекомендации по использованию
- Когда логика фильтрации может изменяться или объекты необходимо динамически фильтровать по различным критериям, рассмотрите использование паттерна Фильтр.
- При проектировании убедитесь, что интерфейс фильтра и его реализации остаются согласованными, чтобы облегчить комбинирование и расширение.
Примечания
- Убедитесь, что логика комбинирования фильтров корректна, чтобы избежать внесения логических ошибок.
- При реализации учитывайте влияние на производительность, особенно при обработке больших объёмов данных.
summary
Паттерн Фильтр включает следующие основные роли:
Интерфейс фильтра (Filter/Criteria): Определяет интерфейс для фильтрации объектов. Этот интерфейс обычно содержит метод для фильтрации объектов по определённым условиям.
Конкретные классы фильтров (Concrete Filter/Concrete Criteria): Реализуют интерфейс фильтра, чтобы конкретно определить условия и логику фильтрации объектов.
Коллекция объектов (элементы/объекты для фильтрации): Коллекция объектов для фильтрации. Эти объекты обычно являются экземплярами с общими атрибутами, например группа людей, группа товаров и т. д.
Клиент: Использует конкретные классы фильтров для фильтрации коллекций объектов. Клиент комбинирует коллекцию объектов с фильтрами, чтобы получить объекты, соответствующие критериям.
Реализация
Мы создадимPersonобъект,Criteriaинтерфейс и классы сущностей, реализующие этот интерфейс, чтобы фильтроватьPersonсписок объектов.CriteriaPatternDemoИспользование классаCriteriaобъектов, фильтрация по различным критериям и их комбинациямPersonсписок объектов.
Шаг 1
Создайте класс, к которому применяются критерии.
Person.java
Шаг 2
Создайте интерфейс для Criteria.
Criteria.java
Шаг 3
Создайте класс реализации сущности интерфейсаCriteria.
CriteriaMale.java
CriteriaFemale.java
CriteriaSingle.java
AndCriteria.java
OrCriteria.java
Шаг 4
Используйте различные Criteria и их комбинации для фильтрацииPersonсписка объектов.
CriteriaPatternDemo.java
Шаг 5
Запустите программу, вывод результата:
Males: Person : [ Name : Robert, Gender : Male, Marital Status : Single ] Person : [ Name : John, Gender : Male, Marital Status : Married ] Person : [ Name : Mike, Gender : Male, Marital Status : Single ] Person : [ Name : Bobby, Gender : Male, Marital Status : Single ] Females: Person : [ Name : Laura, Gender : Female, Marital Status : Married ] Person : [ Name : Diana, Gender : Female, Marital Status : Single ] Single Males: Person : [ Name : Robert, Gender : Male, Marital Status : Single ] Person : [ Name : Mike, Gender : Male, Marital Status : Single ] Person : [ Name : Bobby, Gender : Male, Marital Status : Single ] Single Or Females: Person : [ Name : Robert, Gender : Male, Marital Status : Single ] Person : [ Name : Diana, Gender : Female, Marital Status : Single ] Person : [ Name : Mike, Gender : Male, Marital Status : Single ] Person : [ Name : Bobby, Gender : Male, Marital Status : Single ] Person : [ Name : Laura, Gender : Female, Marital Status : Married ]Другие расширения