过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
下面创建了CriteriaMale、CriteriaFemale、CriteriaSingle、AndCriteria、OrCriteria都实现了Criteria接口并重写了meetCriteria方法,在Client中可以根据需要过滤出所需要的数据
1.创建Criteria接口和Person实体类
package com.design.demo.filter; /** * @author: GuanBin * @date: Created in 下午11:11 2019/8/18 */ public class Person { private String name; private String gender; private String maritalStatus; public Person(String name, String gender, String maritalStatus) { this.name = name; this.gender = gender; this.maritalStatus = maritalStatus; } 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 getMaritalStatus() { return maritalStatus; } public void setMaritalStatus(String maritalStatus) { this.maritalStatus = maritalStatus; } }
package com.design.demo.filter; import java.util.List; /** * @author: GuanBin * @date: Created in 下午11:14 2019/8/18 */ public interface Criteria { public List<Person> meetCriteria(List<Person> personList); }
2.创建CriteriaMale
package com.design.demo.filter; import java.util.ArrayList; import java.util.List; /** * @author: GuanBin * @date: Created in 下午11:15 2019/8/18 */ public class CriteriaMale implements Criteria { @Override public List<Person> meetCriteria(List<Person> personList) { ArrayList<Person> malePersons = new ArrayList<>(); for (Person person : personList) { if (person.getGender().equalsIgnoreCase("MALE")) { malePersons.add(person); } } return malePersons; } }
3.创建CriteriaFemale
package com.design.demo.filter; import java.util.ArrayList; import java.util.List; /** * @author: GuanBin * @date: Created in 下午11:15 2019/8/18 */ public class CriteriaFemale implements Criteria { @Override public List<Person> meetCriteria(List<Person> personList) { ArrayList<Person> femalePersons = new ArrayList<>(); for (Person person : personList) { if (person.getGender().equalsIgnoreCase("FEMALE")) { femalePersons.add(person); } } return femalePersons; } }
4.创建CriteriaSingle
package com.design.demo.filter; import java.util.ArrayList; import java.util.List; /** * @author: GuanBin * @date: Created in 下午11:15 2019/8/18 */ public class CriteriaSingle implements Criteria { @Override public List<Person> meetCriteria(List<Person> personList) { ArrayList<Person> singlePersons = new ArrayList<>(); for (Person person : personList) { if (person.getMaritalStatus().equalsIgnoreCase("SINGLE")) { singlePersons.add(person); } } return singlePersons; } }
5.创建AndCriteria
package com.design.demo.filter; import java.util.ArrayList; import java.util.List; /** * @author: GuanBin * @date: Created in 下午11:15 2019/8/18 */ public class AndCriteria implements Criteria { private Criteria criteria; private Criteria otherCriteria; public AndCriteria(Criteria criteria, Criteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } @Override public List<Person> meetCriteria(List<Person> personList) { List<Person> people = criteria.meetCriteria(personList); return otherCriteria.meetCriteria(people); } }
6.创建OrCriteria
package com.design.demo.filter; import java.util.List; /** * @author: GuanBin * @date: Created in 下午11:15 2019/8/18 */ public class OrCriteria implements Criteria { private Criteria criteria; private Criteria otherCriteria; public OrCriteria(Criteria criteria, Criteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } @Override public List<Person> meetCriteria(List<Person> personList) { List<Person> people = criteria.meetCriteria(personList); List<Person> otherPeople = otherCriteria.meetCriteria(people); otherPeople.stream().forEach(person -> { if(!people.contains(person)){ people.add(person); } }); return people; } }
7.创建Client类
package com.design.demo.filter; import java.util.ArrayList; import java.util.List; /** * @author: GuanBin * @date: Created in 下午11:27 2019/8/18 */ public class Client { public static void main(String[] args) { List<Person> people = new ArrayList<>(); people.add(new Person("lisi","Male","Single")); people.add(new Person("zhangsan","Male","Single")); people.add(new Person("wangwu","Female","Married")); people.add(new Person("zhangliu","Male","Married")); people.add(new Person("wangsi","Female","Single")); CriteriaMale criteriaMale = new CriteriaMale(); CriteriaFemale criteriaFemale = new CriteriaFemale(); CriteriaSingle criteriaSingle = new CriteriaSingle(); //即为女士又是单身的人 AndCriteria andCriteria = new AndCriteria(criteriaMale,criteriaSingle); //男士和单身的人 OrCriteria orCriteria = new OrCriteria(criteriaFemale,criteriaSingle); System.out.println("-----Male"); printPersons(criteriaMale.meetCriteria(people)); System.out.println("-----Female"); printPersons(criteriaFemale.meetCriteria(people)); System.out.println("-----Single"); printPersons(criteriaSingle.meetCriteria(people)); System.out.println("-----Male and Single"); printPersons(andCriteria.meetCriteria(people)); System.out.println("-----Femal or Single"); printPersons(orCriteria.meetCriteria(people)); } public static void printPersons(List<Person> persons){ for (Person person : persons) { System.out.println("Person : [ Name : " + person.getName() +", Gender : " + person.getGender() +", Marital Status : " + person.getMaritalStatus() +" ]"); } } }