一、过滤器模式
1、过滤器模式
过滤器模式(Filter Pattern)是这一种结构型设计模式。过滤器,顾名思义,就是对一组数据进行过滤,从而最终获取到我们预期的数据。
2、实现思路
(1)、定义过滤器的规范接口(生明接口,定义统一的过滤方法)。
(2)、定义过滤器实现类,实现规范接口的过滤方法。
(3)、封装类中定义过滤器类的集合,添加过滤器到封装类中,定义和实现数据过滤的具体方法。
二、代码示例
// 定义基础员工类
@Data
@AllArgsConstructor
public class Employee {private String name;private int age;private String address;
}// 定义接口,设置过滤器统一方法
public interface BaseFilter {boolean filter(Employee data);
}
// 年龄过滤实现类
public class AgeBaseFilter implements BaseFilter {@Overridepublic boolean filter(Employee data) {if (data == null) {return false;}return data.getAge() > 30;}
}
// 地址过滤实现类
public class AddressBaseFilter implements BaseFilter {@Overridepublic boolean filter(Employee data) {if (data == null) {return false;}return data.getAddress().contains("北京");}
}// 封装过滤链类
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;public class EmployeeFilterUtil {private static List<BaseFilter> filters;public static void addFilter(BaseFilter filter) { // 添加过滤器if (filters == null) {filters = new ArrayList<>();}filters.add(filter);}public static List<Employee> getFilterData(List<Employee> employeeList) { // 过滤员工数据List<Employee> filterData = new ArrayList<>();if (!CollectionUtils.isEmpty(employeeList) && !CollectionUtils.isEmpty(filters)) {for (Employee employee : employeeList) {for (BaseFilter filter : filters) {if (!filter.filter(employee)) {employee = null;}}if (employee != null) {filterData.add(employee);}}} else {filterData = employeeList;}return filterData;}
}
// 测试
public static void main(String[] args) {List<Employee> employeeList = new ArrayList<>();Employee employee = new Employee("张三",29,"上海红桥区");employeeList.add(employee);employee = new Employee("张三1",30,"北京天安门");employeeList.add(employee);employee = new Employee("张三2",31,"北京天安门1");employeeList.add(employee);employee = new Employee("张三3",32,"上海红桥区1");employeeList.add(employee);employee = new Employee("张三4",33,"上海红桥区2");employeeList.add(employee);employee = new Employee("张三5",34,"北京天安门2");employeeList.add(employee);employee = new Employee("张三6",27,"1");employeeList.add(employee);// 添加过滤器EmployeeFilterUtil.addFilter(new AgeBaseFilter());EmployeeFilterUtil.addFilter(new AddressBaseFilter());// 使用过滤器链过滤数据List<Employee> filterData = EmployeeFilterUtil.getFilterData(employeeList);System.out.println("大于30岁的北京员工有:"+ JSON.toJSONString(filterData));}
运行接口:
说明:
运行结果可以看出实现了过滤效果。
总结:
过滤器模式是对一组数据进行过滤,从而达到我们希望数据的设计模式。首先需要定义统一过滤方法,之后就是根据需要编写各种实现类,对需要的场景搭配不同的过滤器链路,让数据经过这些过滤器链路后获取我们需要数据的过程。
学海无涯苦作舟!!!