什么是过滤器模式?what
过滤器模式(Filter)也叫标准模式(Criteria),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
过滤器模式适用于把统一实体类中根据不同属性进行过滤区分;
主要角色:
目标对象(Target):处理请求,根据要求执行任务。
过滤器(Filter):过滤器在请求处理程序执行请求之前或之后,执行某些任务。
过滤器链(Filter Chain):过滤器链带有多个过滤器,并在 Target 之前按照定义的顺序执行这些过滤器。
过滤管理器(Filter Manager):过滤管理器管理过滤器和过滤器链。
例如:
一个商场中有不同的口红,口红有:品牌名、色号、价格、适用肤色;一个顾客需要在里面过滤筛选一下口红,如需要 色号为枣红、价格在200一下,这种情况就需要使用过滤器进行过滤;
怎么实现过滤器模式?how
这里使用区分人的 单身和男女
Person类中的代码:
public class Person {private String name; // 姓名private String gender; // 性别private String marital; // 婚姻情况public Person(String name, String gender, String marital) {this.name = name;this.gender = gender;this.marital = marital;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getMarital() {return marital;}public void setMarital(String marital) {this.marital = marital;}@Overridepublic String toString() {return "Person [name=" + name + ",gender=" + gender + ", marital=" + marital + "]";}}
Filter接口中的代码:
public interface Filter {// 根据传过来的Person列表,根据一定的条件过滤,得到目标集合List<Person> filter(List<Person> persons);}
**
MaleFilter类中的代码:
public class MaleFilter implements Filter {@Overridepublic List<Person> filter(List<Person> persons) {List<Person> result = new ArrayList<>();for (Person person : persons) {if ("MALE".equalsIgnoreCase(person.getGender())) {result.add(person);}}return result;}}
处理“并且”逻辑的过滤器类FilterAnd类中的代码:
public class FilterAnd implements Filter {private Filter filter;private Filter otherFilter;public FilterAnd(Filter filter, Filter otherFilter) {this.filter = filter;this.otherFilter = otherFilter;}@Overridepublic List<Person> filter(List<Person> persons) {List<Person> tmpList = filter.filter(persons);return otherFilter.filter(tmpList);}}
**
处理“或者”逻辑的过滤器类FilterOr类中的代码:
public class FilterOr implements Filter {private Filter filter;private Filter otherFilter;public FilterOr(Filter filter, Filter otherFilter) {this.filter = filter;this.otherFilter = otherFilter;}@Overridepublic List<Person> filter(List<Person> persons) {List<Person> tmpList1 = filter.filter(persons);List<Person> tmpList2 = otherFilter.filter(persons);for (Person person : tmpList2) {if (!tmpList1.contains(person)) {tmpList1.add(person);}}return tmpList1;}}
测试类Test中的代码:
public class Test {public static void main(String[] args) {// 初始化数据List<Person> persons = new ArrayList<>();persons.add(new Person("霍一", "FEMALE", "MARRIED"));persons.add(new Person("邓二", "MALE", "MARRIED"));persons.add(new Person("张三", "MALE", "SINGLE"));persons.add(new Person("李四", "FEMALE", "MARRIED"));persons.add(new Person("王五", "MALE", "SINGLE"));persons.add(new Person("赵六", "FEMALE", "SINGLE"));persons.add(new Person("孙七", "MALE", "SINGLE"));persons.add(new Person("罗八", "MALE", "MARRIED"));persons.add(new Person("刘九", "FEMALE", "SINGLE"));persons.add(new Person("史十", "FEMALE", "SINGLE"));// 打印出所有男性的信息System.out.println("---------------------所有男性---------------------");List<Person> maleList = new MaleFilter().filter(persons);printList(maleList);// 打印出所有单身的信息System.out.println("---------------------所有单身---------------------");List<Person> singleList = new SingleFilter().filter(persons);printList(singleList);// 打印出所有已婚女性的信息System.out.println("--------------------所有已婚女性-------------------");List<Person> marriedFemaleList = new FilterAnd(new MarriedFilter(), new FemaleFilter()).filter(persons);printList(marriedFemaleList);// 打印出所有单身或女性的信息System.out.println("-------------------所有单身或女性------------------");List<Person> singleOrFemaleList = new FilterOr(new SingleFilter(), new FemaleFilter()).filter(persons);printList(singleOrFemaleList);}// 打印列表中的数据信息private static void printList(List<Person> list) {for (Person person : list) {System.out.println(person.toString());}}}
测试代码如下图所示:
为什么使用过滤器?why
使用过滤器可以对一类对象的某些属性进行分类过滤,通过过滤器可以把对象归类;
