美文网首页
过滤器模式,是如何过滤的,你知道吗?

过滤器模式,是如何过滤的,你知道吗?

作者: 程就人生 | 来源:发表于2022-03-08 22:02 被阅读0次

过滤器模式,你的心里还有没有印象,在哪里用到过?

过滤器模式(filter pattern),允许开发人员使用不同的标准来过滤一个对象,通过逻辑运算以解耦的方式把它们连接起来,属于构建型模式,又称标准模式(criteria pattern)。

图片

业务场景:需要进行条件过滤的时候。

图片

UML类图

1. 创建应用标准的类;

/**
 * 1. 创建一个类,在该类上应用该标准
 * @author 程就人生
 * @Date
 */
public class Person {
  
  public Person(String name, String sex, int age) {
    this.name = name;
    this.sex = sex;
    this.age = age;
  }

  private String name;
  
  private String sex;
    
  private int age;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }
  
  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  @Override
  public String toString() {
    return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
  }
}

2. 为标准创建接口;

import java.util.List;
/**
 * 2.为标准创建一个接口
 * @author 程就人生
 * @Date
 */
public interface ICriteria {

  public List<Person> filter(List<Person> personList);
}

3. 多个标准接口实现类;

import java.util.List;
/**
 * 3.标准接口实现类
 * @author 程就人生
 * @Date
 */
public class AddCriteria implements ICriteria {

  private ICriteria criteria1;
  
  private ICriteria criteria2;  
  
  public AddCriteria(ICriteria criteria1, ICriteria criteria2) {
    this.criteria1 = criteria1;
    this.criteria2 = criteria2;
  }

  @Override
  public List<Person> filter(List<Person> personList) {
    List<Person> criteria = criteria1.filter(personList);
    return criteria2.filter(criteria);
  }
}

import java.util.List;
import java.util.stream.Collectors;
/**
 * 3.标准接口实现类
 * @author 程就人生
 * @Date
 */
public class AgeCriteria implements ICriteria{

  @Override
  public List<Person> filter(List<Person> personList) {
    return personList.stream().filter(person->person.getAge() >=18 ).collect(Collectors.toList());
  }

}

import java.util.List;
import java.util.stream.Collectors;

/**
 * 3.标准接口实现类
 * @author 程就人生
 * @Date
 */
public class FemaleCriteria implements ICriteria{

  @Override
  public List<Person> filter(List<Person> personList) {
      return personList.stream().filter(person->person.getSex().equals("女")).collect(Collectors.toList());
  }

}

import java.util.List;
import java.util.stream.Collectors;

/**
 * 3.标准接口实现类
 * @author 程就人生
 * @Date
 */
public class MaleCriteria implements ICriteria{

  @Override
  public List<Person> filter(List<Person> personList) {
      return personList.stream().filter(person->person.getSex().equals("男")).collect(Collectors.toList());
  }

}

import java.util.List;
/**
 * 3.标准接口实现类
 * @author 程就人生
 * @Date
 */
public class OrCriteria implements ICriteria{

    private ICriteria criteria1;
  
  private ICriteria criteria2;  
  
  public OrCriteria(ICriteria criteria1, ICriteria criteria2) {
    this.criteria1 = criteria1;
    this.criteria2 = criteria2;
  }
  
  @Override
  public List<Person> filter(List<Person> personList) {
    List<Person> firstCriteriaItems = criteria1.filter(personList);
        List<Person> otherCriteriaItems = criteria2.filter(personList); 
        for (Person person : otherCriteriaItems) {
          if(!firstCriteriaItems.contains(person)){
            firstCriteriaItems.add(person);
          }
       }  
       return firstCriteriaItems;
  }
}

4. 简单应用;

public static void main(String[] argo){
    List<Person> personList = new ArrayList<Person>();
    personList.add(new Person("张三", "女", 20)); 
    personList.add(new Person("老张", "女", 40)); 
    personList.add(new Person("小明", "男", 15)); 
    personList.add(new Person("李四", "男", 30));
    personList.add(new Person("王五", "男", 35));
    personList.add(new Person("王麻子", "未知", 45));
    
    // 女性
    ICriteria femaleCriteria = new FemaleCriteria();
    List<Person> list = femaleCriteria.filter(personList);
    System.out.println("女性为:" + list);
    
    // 成年男性
    ICriteria maleCriteria = new MaleCriteria();
    ICriteria ageCriteria = new AgeCriteria();
    ICriteria addCriteria = new AddCriteria(maleCriteria, ageCriteria);
    list = addCriteria.filter(personList);
    System.out.println("成年男性:" + list);
    
    // 男性或者女性    
    ICriteria orCriteria = new OrCriteria(maleCriteria, femaleCriteria);
    list = orCriteria.filter(personList);
    System.out.println("男性或者女性为:" + list);
    
  }

这段代码的意思是:有一队人,进行条件筛选,第一次筛选女性,第二次筛选成年男性,第三次筛选已知性别的人,不符合条件的不进入选中队列。

运行结果:

女性为:[Person [name=张三, sex=女, age=20], Person [name=老张, sex=女, age=40]]
成年男性:[Person [name=李四, sex=男, age=30], Person [name=王五, sex=男, age=35]]
男性或者女性为:[Person [name=小明, sex=男, age=15], Person [name=李四, sex=男, age=30], Person [name=王五, sex=男, age=35], Person [name=张三, sex=女, age=20], Person [name=老张, sex=女, age=40]]

相关文章

网友评论

      本文标题:过滤器模式,是如何过滤的,你知道吗?

      本文链接:https://www.haomeiwen.com/subject/tirzrrtx.html