过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

- 定义一个java bean
/**
* 人
*
* @author 吴尚慧
* @since 2022/6/25 21:41
*/
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;
}
}
- 定义一个标准接口
/**
* 标准 接口
*
* @author 吴尚慧
* @since 2022/6/25 21:43
*/
public interface Criteria {
/**
* 满足标准
*
* @param persons 人列表
* @return 满足的人列表
*/
public List<Person> meetCriteria(List<Person> persons);
}
- 标准接口的实现类们
过滤出男人的实现类
/**
* 标准男性
*
* @author 吴尚慧
* @since 2022/6/25 21:45
*/
public class CriteriaMale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> malePersons = new ArrayList<>();
for (Person person : persons) {
if(person.getGender().equalsIgnoreCase("MALE")){
malePersons.add(person);
}
}
return malePersons;
}
}
过滤出女人的实现类
/**
* 标准女性
*
* @author 吴尚慧
* @since 2022/6/25 21:46
*/
public class CriteriaFemale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> femalePersons = new ArrayList<>();
for (Person person : persons) {
if (person.getGender().equalsIgnoreCase("FEMALE")) {
femalePersons.add(person);
}
}
return femalePersons;
}
}
过滤出单身的实现类
/**
* 单身
*
* @author 吴尚慧
* @since 2022/6/25 22:00
*/
public class CriteriaSingle implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> singlePersons = new ArrayList<>();
for (Person person : persons) {
if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){
singlePersons.add(person);
}
}
return singlePersons;
}
}
同时满足两个标准的实现类
/**
* @author 吴尚慧
* @since 2022/6/25 22:01
*/
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> persons) {
List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);
return otherCriteria.meetCriteria(firstCriteriaPersons);
}
}
只需满足一个标准的实现类
/**
* @author 吴尚慧
* @since 2022/6/25 22:01
*/
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> persons) {
List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);
// 取两个集合并集,去除重复的
for (Person person : otherCriteriaItems) {
if(!firstCriteriaItems.contains(person)){
firstCriteriaItems.add(person);
}
}
return firstCriteriaItems;
}
}
- 测试类
/**
* @author 吴尚慧
* @since 2022/6/25 22:02
*/
public class CriteriaPatternDemo {
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Robert","Male", "Single"));
persons.add(new Person("John","Male", "Married"));
persons.add(new Person("Laura","Female", "Married"));
persons.add(new Person("Diana","Female", "Single"));
persons.add(new Person("Mike","Male", "Single"));
persons.add(new Person("Bobby","Male", "Single"));
Criteria male = new CriteriaMale();
Criteria female = new CriteriaFemale();
Criteria single = new CriteriaSingle();
Criteria singleMale = new AndCriteria(single, male);
Criteria singleOrFemale = new OrCriteria(single, female);
System.out.println("Males: ");
printPersons(male.meetCriteria(persons));
System.out.println("\nFemales: ");
printPersons(female.meetCriteria(persons));
System.out.println("\nSingle Males: ");
printPersons(singleMale.meetCriteria(persons));
System.out.println("\nSingle Or Females: ");
printPersons(singleOrFemale.meetCriteria(persons));
}
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()
+" ]");
}
}
}
结果:
Males:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : John, Gender : Male, Marital Status : Married ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
Females:
Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
Single Males:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
Single Or Females:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
根据上面不同的标准,可以过滤出来不同的结果,你学会了吗?
java8中 Collectors.groupingBy以及 filter 都是标准(过滤器)哦。
参考:
https://www.runoob.com/design-pattern/design-pattern-intro.html
本文介绍了过滤器模式(FilterPattern),这是一种结构型设计模式,用于组合多个标准来过滤对象集合。通过定义标准接口和其不同实现,如男性、女性、单身等,实现了灵活的过滤逻辑。同时,展示了如何使用AndCriteria和OrCriteria组合标准,实现更复杂的过滤条件。在Java8中,Collectors.groupingBy和filter方法也是实现类似功能的工具。
&spm=1001.2101.3001.5002&articleId=125464426&d=1&t=3&u=013e5e6063c74d71a6b1d7bf6adc350c)
41万+

被折叠的 条评论
为什么被折叠?



