一、过滤器模式
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 {
@Override
public boolean filter(Employee data) {
if (data == null) {
return false;
}
return data.getAge() > 30;
}
}
// 地址过滤实现类
public class AddressBaseFilter implements BaseFilter {
@Override
public 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));
}
运行接口:
说明:
运行结果可以看出实现了过滤效果。
总结:
过滤器模式是对一组数据进行过滤,从而达到我们希望数据的设计模式。首先需要定义统一过滤方法,之后就是根据需要编写各种实现类,对需要的场景搭配不同的过滤器链路,让数据经过这些过滤器链路后获取我们需要数据的过程。
学海无涯苦作舟!!!