Github: CriteriaPattern.java
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
创建Person类
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 String getGender() {return gender;}public String getMaritalStatus() {return maritalStatus;}@Overridepublic String toString() {return "Person{" + "name='" + name + '\'' + ", gender='" + gender + '\'' + ", maritalStatus='" + maritalStatus + '\'' + '}';}}
定义过滤器接口,统一的过滤方法
/*** 过滤器接口*/public interface Criteria{List<Person> meetCriteria(List<Person> personList);}
定义男女性别过滤实现类 ```java /**
- 男性过滤器
*/
public class CriteriaMale implements Criteria {
@Override
public List
meetCriteria(List personList) { return personList.stream().filter(p -> “male”.equalsIgnoreCase(p.getGender())).collect(Collectors.toList()); } }
- 男性过滤器
*/
public class CriteriaMale implements Criteria {
@Override
public List
/**
- 女性过滤器
*/
public class CriteriaFemale implements Criteria{
@Override
public List
meetCriteria(List personList) {
} } ```return personList.stream().filter(p -> "female".equalsIgnoreCase(p.getGender())).collect(Collectors.toList());
- 定义Person婚姻状态实现类
```java
/**
- 单身过滤器
*/
public class CriteriaSingle implements Criteria{
@Override
public List
meetCriteria(List personList) { return personList.stream().filter(p -> “single”.equalsIgnoreCase(p.getMaritalStatus())).collect(Collectors.toList()); } }
- 单身过滤器
*/
public class CriteriaSingle implements Criteria{
@Override
public List
/**
- 已婚过滤器
*/
public class CriteriaMarried implements Criteria{
@Override
public List
meetCriteria(List personList) {
} } ```return personList.stream().filter(p -> "married".equalsIgnoreCase(p.getMaritalStatus())).collect(Collectors.toList());
定义逻辑过滤器:
并且,或实现类 ```java /**and: 并且逻辑 */ public class AndCriteria implements Criteria{ private Criteria criteria; private Criteria otherCriteria;
private AndCriteria() { }
public AndCriteria(Criteria criteria, Criteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; }
@Override public List
meetCriteria(List personList) { // 1. 筛选出部分person List criteriaPerson = criteria.meetCriteria(personList); // 2. 再从步骤1筛选的结果中再筛选,从而达到and效果 return otherCriteria.meetCriteria(criteriaPerson); } }
/**
or: 或逻辑 */ public class OrCriteria implements Criteria{ private Criteria criteria; private Criteria otherCriteria;
private OrCriteria() { }
public OrCriteria(Criteria criteria, Criteria otherCriteria) {
this.criteria = criteria;this.otherCriteria = otherCriteria;
}
@Override public List
meetCriteria(List personList) { // 1. 筛选出各自的personList<Person> people = criteria.meetCriteria(personList);List<Person> people1 = otherCriteria.meetCriteria(personList);// 2. 此时,将2个结果合并返回即是or的结果。但是防止数据重复,则有个排重逻辑for (Person person : people1) {if(!people.contains(person)){people.add(person);}}return people;
} } ```
- 测试 ```java public static void main(String[] args) { CriteriaPattern pattern = new CriteriaPattern(); pattern.criteria(); }
private void criteria() {
List
Criteria female = new CriteriaFemale();List<Person> femalePerson = female.meetCriteria(list);System.out.println("female:");System.out.println(femalePerson);Criteria male = new CriteriaMale();List<Person> malePeople = male.meetCriteria(list);System.out.println("\nmale:");System.out.println(malePeople);Criteria single = new CriteriaSingle();List<Person> singlePerson = single.meetCriteria(list);System.out.println("\nsingle:");System.out.println(singlePerson);Criteria or = new OrCriteria(female, single);List<Person> orPerson = or.meetCriteria(list);System.out.println("\nfemale or single:");System.out.println(orPerson);
}
输出结果:```javafemale:[Person{name='s', gender='female', maritalStatus='single'}, Person{name='ss', gender='female', maritalStatus='single'}, Person{name='ssf', gender='female', maritalStatus='single'}]male:[Person{name='s', gender='male', maritalStatus='single'}, Person{name='ssfs', gender='male', maritalStatus='single'}, Person{name='asdf', gender='male', maritalStatus='married'}]single:[Person{name='s', gender='male', maritalStatus='single'}, Person{name='s', gender='female', maritalStatus='single'}, Person{name='ss', gender='female', maritalStatus='single'}, Person{name='ssf', gender='female', maritalStatus='single'}, Person{name='ssfs', gender='male', maritalStatus='single'}]female or single:[Person{name='s', gender='female', maritalStatus='single'}, Person{name='ss', gender='female', maritalStatus='single'}, Person{name='ssf', gender='female', maritalStatus='single'}, Person{name='s', gender='male', maritalStatus='single'}, Person{name='ssfs', gender='male', maritalStatus='single'}]
这里性别,婚姻状态直接是字符串,可以使用枚举替换,更好一些。
如果想根据年龄来过滤童年,中年,老年等。可以在Person增加age变量,并且增加相应年龄段的过滤器(比如增加同年童年过滤器)。
