过滤器模式(Filter)

转载自:http://blog.csdn.net/itgungnir/article/details/53571557

1      模式简介

过滤器模式(Filter)也叫标准模式(Criteria),这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。

 

2      实例

需求:

Person类有三个属性:姓名(Name)、性别(Gender)和婚姻情况(Marital),我们的系统中的一些功能需要对这些属性进行筛选,比如:

1)        得到所有的男性;

2)        得到所有的女性;

3)        得到所有还单身的人;

4)        得到所有已婚的人。

系统还希望能够将这些条件组合起来进行筛选,比如:

1)        得到所有已婚男性;

2)        得到所有单身女性;

3)        得到所有已婚的人或女性;

 

分析:

要解决这个问题,我们可以使用过滤器模式。使用过滤器模式解决这个问题的UML图如下图所示:

 

代码:

Person类中的代码:

[java]  view plain  copy
  1. public class Person {  
  2.    private String name; // 姓名  
  3.    private String gender; // 性别  
  4.    private String marital; // 婚姻情况  
  5.    
  6.    public Person(String name, String gender, String marital) {  
  7.       this.name = name;  
  8.       this.gender = gender;  
  9.       this.marital = marital;  
  10.    }  
  11.    
  12.    public String getName() {  
  13.       return name;  
  14.    }  
  15.    
  16.    public void setName(String name) {  
  17.       this.name = name;  
  18.    }  
  19.    
  20.    public String getGender() {  
  21.       return gender;  
  22.    }  
  23.    
  24.    public void setGender(String gender) {  
  25.       this.gender = gender;  
  26.    }  
  27.    
  28.    public String getMarital() {  
  29.       return marital;  
  30.    }  
  31.    
  32.    public void setMarital(String marital) {  
  33.       this.marital = marital;  
  34.    }  
  35.    
  36.    @Override  
  37.    public String toString() {  
  38.       return "Person [name=" + name + ",gender=" + gender + ", marital=" + marital + "]";  
  39.    }  
  40. }  
Filter接口中的代码:

[java]  view plain  copy
  1. public interface Filter {  
  2.    // 根据传过来的Person列表,根据一定的条件过滤,得到目标集合  
  3.    List<Person> filter(List<Person> persons);  
  4. }  
MaleFilter类中的代码:

[java]  view plain  copy
  1. public class MaleFilter implements Filter {  
  2.    
  3.    @Override  
  4.    public List<Person> filter(List<Person> persons) {  
  5.       List<Person> result = new ArrayList<>();  
  6.       for (Person person : persons) {  
  7.          if ("MALE".equalsIgnoreCase(person.getGender())) {  
  8.             result.add(person);  
  9.          }  
  10.       }  
  11.       return result;  
  12.    }  
  13. }  
处理“并且”逻辑的过滤器类FilterAnd类中的代码:

[java]  view plain  copy
  1. public class FilterAnd implements Filter {  
  2.    private Filter filter;  
  3.    private Filter otherFilter;  
  4.    
  5.    public FilterAnd(Filter filter, Filter otherFilter) {  
  6.       this.filter = filter;  
  7.       this.otherFilter = otherFilter;  
  8.    }  
  9.    
  10.    @Override  
  11.    public List<Person> filter(List<Person> persons) {  
  12.       List<Person> tmpList = filter.filter(persons);  
  13.       return otherFilter.filter(tmpList);  
  14.    }  
  15. }  
处理“或者”逻辑的过滤器类FilterOr类中的代码:

[java]  view plain  copy
  1. public class FilterOr implements Filter {  
  2.    private Filter filter;  
  3.    private Filter otherFilter;  
  4.    
  5.    public FilterOr(Filter filter, Filter otherFilter) {  
  6.       this.filter = filter;  
  7.       this.otherFilter = otherFilter;  
  8.    }  
  9.    
  10.    @Override  
  11.    public List<Person> filter(List<Person> persons) {  
  12.       List<Person> tmpList1 = filter.filter(persons);  
  13.       List<Person> tmpList2 = otherFilter.filter(persons);  
  14.       for (Person person : tmpList2) {  
  15.          if (!tmpList1.contains(person)) {  
  16.             tmpList1.add(person);  
  17.          }  
  18.       }  
  19.       return tmpList1;  
  20.    }  
  21. }  
测试类Test中的代码:

[java]  view plain  copy
  1. public class Test {  
  2.    public static void main(String[] args) {  
  3.       // 初始化数据  
  4.       List<Person> persons = new ArrayList<>();  
  5.       persons.add(new Person("霍一""FEMALE""MARRIED"));  
  6.       persons.add(new Person("邓二""MALE""MARRIED"));  
  7.       persons.add(new Person("张三""MALE""SINGLE"));  
  8.       persons.add(new Person("李四""FEMALE""MARRIED"));  
  9.       persons.add(new Person("王五""MALE""SINGLE"));  
  10.       persons.add(new Person("赵六""FEMALE""SINGLE"));  
  11.       persons.add(new Person("孙七""MALE""SINGLE"));  
  12.       persons.add(new Person("罗八""MALE""MARRIED"));  
  13.       persons.add(new Person("刘九""FEMALE""SINGLE"));  
  14.       persons.add(new Person("史十""FEMALE""SINGLE"));  
  15.       // 打印出所有男性的信息  
  16.       System.out.println("---------------------所有男性---------------------");  
  17.       List<Person> maleList = new MaleFilter().filter(persons);  
  18.       printList(maleList);  
  19.       // 打印出所有单身的信息  
  20.       System.out.println("---------------------所有单身---------------------");  
  21.       List<Person> singleList = new SingleFilter().filter(persons);  
  22.       printList(singleList);  
  23.       // 打印出所有已婚女性的信息  
  24.       System.out.println("--------------------所有已婚女性-------------------");  
  25.       List<Person> marriedFemaleList = new FilterAnd(new MarriedFilter(), new FemaleFilter()).filter(persons);  
  26.       printList(marriedFemaleList);  
  27.       // 打印出所有单身或女性的信息  
  28.       System.out.println("-------------------所有单身或女性------------------");  
  29.       List<Person> singleOrFemaleList = new FilterOr(new SingleFilter(), new FemaleFilter()).filter(persons);  
  30.       printList(singleOrFemaleList);  
  31.    }  
  32.    
  33.    // 打印列表中的数据信息  
  34.    private static void printList(List<Person> list) {  
  35.       for (Person person : list) {  
  36.          System.out.println(person.toString());  
  37.       }  
  38.    }  
  39. }  
测试代码如下图所示:


猜你喜欢

转载自blog.csdn.net/qq_37150783/article/details/79618011