设计模式-3-过滤器模式

215 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第六天,点击查看活动详情

PS:已经更文多少天,N就写几。一定要写对文案,否则文章不计入在内;模板句子需要带超链接。

过滤器模式(Filter Pattern)或者叫标准模式(Criteria Pattern),就是在全部对象中过滤出我们所定义的标准对应的对象,也属于结构型模式。过滤器模式允许开发人员使用不同的标准,也就是我们自定义的某些规则,来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。 过滤器模式一般作为筛选器来使用,在一堆的数据中,我们要使用其中满足一定条件的一部分数据,此时就可以使用过滤器模式。

实现元素:

  • 对象(组成集合)

  • 接口(标准)

  • 实现(不同的标准实现)

一、建立一个对象

package com.xing.design.filter;
/** * 员工类 * @author xing * @createTime */public class Employee {/**   * 名字   */private String name;/**   * 性别   */private String gender;/**   * 机构    */private String dept;/**   * 工资   */  private int salary;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 getDept() {return dept;  }public void setDept(String dept) {this.dept = dept;  }public int getSalary() {return salary;  }public void setSalary(int salary) {this.salary = salary;  }
/**   * 构造   * @param name 名称   * @param dept 机构   * @param sal 工资   */public Employee(String name, String gender, String dept, int sal) {this.name = name;this.gender = gender;this.dept = dept;this.salary = sal;  }public String toString(){return ("Employee :[ Name : "+ name      +", dept : "+ dept + ", salary :"     + salary+" ]");  }   }

二、编写一个标准接口,用来建立过滤规则

package com.xing.design.filter;
import java.util.List;
/** *  标准 * @author xing * @createTime */public interface Criteria {/**   *  过滤   * @param list   * @return   */  List<Employee> fiterGril(List<Employee> list);}

三、实现上述接口,编写两个不同的过滤规则

1.工资高的肯定好

package com.xing.design.filter;
import java.util.ArrayList;import java.util.List;
/** *  通过工资过滤筛选 * @author xing * @createTime */public class SalaCriteria implements Criteria{
  @Overridepublic List<Employee> fiterGril(List<Employee> list) {List<Employee> newList = new ArrayList<>();for(Employee e : list) {if(e.getSalary() > 100) {        newList.add(e);      }    }return newList;  }
}

2.只要真实性别是女的

package com.xing.design.filter;
import java.util.ArrayList;import java.util.List;
/** *  通过性别过滤筛选 * @author xing * @createTime */public class GenderCriteria implements Criteria{
  @Overridepublic List<Employee> fiterGril(List<Employee> list) {List<Employee> newList = new ArrayList<>();for(Employee e : list) {if("女".equals(e.getGender())) {        newList.add(e);      }    }return newList;  }}

        这样,过滤规则就写好了,我们来使用一下。

四、测试

package com.xing.design.filter;
import java.util.ArrayList;import java.util.List;
/** *  过滤器模式 Filter Pattern * @author xing * @createTime */public class FilterPatternDemo {
public static void main(String[] args) {// 一群公主    List<Employee> list = new ArrayList<>();list.add(new Employee("小野", "男", "怡红院", 500));list.add(new Employee("小红", "女", "怡红院", 500));list.add(new Employee("老鸨", "女", "怡红院", 500));list.add(new Employee("加藤鹰", "男", "KTV", 200));list.add(new Employee("波多野结衣", "女", "KTV", 200));list.add(new Employee("苍井空", "女", "怡红院", 1000));// 工资高肯定就好    Criteria salaCriteria = new SalaCriteria();    System.out.println("工资大于100的:");    System.out.println(salaCriteria.fiterGril(list));
// 剔除人妖    Criteria genderCriteria = new GenderCriteria();    System.out.println("性别真实是女的:");    System.out.println(genderCriteria.fiterGril(list));  }}

结果:

        我们用工资和性别,过滤出了不同的对象集合,挑吧。

image.png

总结:

        在一堆数据中,根据我们自定义的某些规则来过滤出我们需要的数据集,这就是过滤器模式。适合的业务场景是在一堆数据中,需要进行条件过滤的时候使用。在日常开发中,最复杂的应该是要自定义出自己想要的数据需要什么规则才能过滤出来。

END

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第六天,点击查看活动详情

PS:已经更文多少天,N就写几。一定要写对文案,否则文章不计入在内;模板句子需要带超链接。