设计模式 - 过滤器模式
封面图
•
2025-11-08
•
设计模式
0
0
0
0
过滤器模式(**Filter Pattern**)是 **结构型设计模式** 中的一种,用于根据特定条件对对象进行筛选或处理。它常用于构建可组合的、灵活的过滤逻辑,尤其是在需要根据多个条件动态筛选数据时非常有用。 --- ## 📌 一、定义 **过滤器模式** 允许你通过组合不同的过滤器来筛选对象集合,每个过滤器可以独立地实现一个筛选条件,并且可以与其他过滤器组合使用。 --- ## 🧩 二、核心思想 - **抽象过滤器接口**:定义一个统一的过滤方法。 - **具体过滤器类**:实现具体的过滤逻辑。 - **过滤器链**:将多个过滤器按顺序组合在一起,形成一个过滤链。 - **目标对象**:被过滤的数据对象(如用户、商品等)。 --- ## 🧱 三、结构图 ``` +---------------------+ | Filter (Interface)| +---------------------+ | v +---------------------+ +---------------------+ | MaleFilter | | SingleFilter | +---------------------+ +---------------------+ | | v v +---------------------+ | AndFilter | +---------------------+ | v +---------------------+ | FilterChain | +---------------------+ | v +---------------------+ | Person (Target) | +---------------------+ ``` --- ## 🔧 四、实现示例(Java) ### 1. 定义目标对象(Person) ```java public class Person { private String name; private String gender; private String maritalStatus; public Person(String name, String gender, String maritalStatus) { this.name = name; this.gender = gender; this.maritalStatus = maritalStatus; } public String getName() { return name; } public String getGender() { return gender; } public String getMaritalStatus() { return maritalStatus; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", gender='" + gender + '\'' + ", maritalStatus='" + maritalStatus + '\'' + '}'; } } ``` ### 2. 定义过滤器接口 ```java public interface Filter { List<Person> filter(List<Person> persons); } ``` ### 3. 实现具体过滤器 ```java import java.util.List; import java.util.stream.Collectors; public class MaleFilter implements Filter { @Override public List<Person> filter(List<Person> persons) { return persons.stream() .filter(p -> p.getGender().equalsIgnoreCase("MALE")) .collect(Collectors.toList()); } } public class SingleFilter implements Filter { @Override public List<Person> filter(List<Person> persons) { return persons.stream() .filter(p -> p.getMaritalStatus().equalsIgnoreCase("SINGLE")) .collect(Collectors.toList()); } } public class AndFilter implements Filter { private Filter filter1; private Filter filter2; public AndFilter(Filter filter1, Filter filter2) { this.filter1 = filter1; this.filter2 = filter2; } @Override public List<Person> filter(List<Person> persons) { List<Person> result1 = filter1.filter(persons); return filter2.filter(result1); } } ``` ### 4. 使用过滤器链 ```java import java.util.Arrays; import java.util.List; public class FilterPatternDemo { public static void main(String[] args) { List<Person> persons = Arrays.asList( new Person("John", "MALE", "SINGLE"), new Person("Jane", "FEMALE", "MARRIED"), new Person("Mike", "MALE", "MARRIED"), new Person("Anna", "FEMALE", "SINGLE") ); Filter maleFilter = new MaleFilter(); Filter singleFilter = new SingleFilter(); Filter andFilter = new AndFilter(maleFilter, singleFilter); List<Person> result = andFilter.filter(persons); result.forEach(System.out::println); } } ``` ### 输出结果: ``` Person{name='John', gender='MALE', maritalStatus='SINGLE'} ``` --- ## ✅ 五、优点 - **灵活性高**:可以动态组合多个过滤器。 - **可扩展性强**:新增过滤器不需要修改现有代码。 - **职责分离**:每个过滤器只负责一个逻辑,易于维护和测试。 --- ## ❌ 六、缺点 - **复杂度增加**:过多的过滤器可能使系统变得难以理解。 - **性能问题**:如果过滤器链太长,可能影响性能。 --- ## 🎯 七、适用场景 - 需要根据多种条件筛选数据(如搜索功能、报表过滤等)。 - 需要动态组合过滤条件(如用户自定义筛选规则)。 - 数据处理流程中需要分步骤过滤。 --- ## 📚 八、相关设计模式 - **责任链模式(Chain of Responsibility)**:与过滤器模式类似,但更强调“请求传递”而不是“数据筛选”。 - **策略模式(Strategy)**:允许在运行时切换不同的算法,而过滤器模式侧重于组合多个条件。 --- 如果你有具体的业务场景,我可以帮你设计一个实际的过滤器模式应用。欢迎继续提问!
上一篇:
设计模式 - 桥接模式
标题录入,一次不能超过6条
留言
评论