设计模式-过滤模式
Posted guanbin-529
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-过滤模式相关的知识,希望对你有一定的参考价值。
过滤器模式(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() +" ]");
以上是关于设计模式-过滤模式的主要内容,如果未能解决你的问题,请参考以下文章