Java设计模式 _结构型模式_过滤器模式

发布于:2024-05-02 ⋅ 阅读:(176) ⋅ 点赞:(0)

一、过滤器模式

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

运行接口:
在这里插入图片描述
说明:
运行结果可以看出实现了过滤效果。

总结:
过滤器模式是对一组数据进行过滤,从而达到我们希望数据的设计模式。首先需要定义统一过滤方法,之后就是根据需要编写各种实现类,对需要的场景搭配不同的过滤器链路,让数据经过这些过滤器链路后获取我们需要数据的过程。

学海无涯苦作舟!!!


网站公告

今日签到

点亮在社区的每一天
去签到