一、概述
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
二、使用
示例:
package pattern.filter; import lombok.AllArgsConstructor; import lombok.Data; import java.util.ArrayList; import java.util.List; /** * 过滤模式 * @author zls * @date 2020/3/26 */ public class FilterTest { public static void main(String[] args) { List<Person> list = new ArrayList<>(); list.add(new Person("王鸥", 32, "female")); list.add(new Person("宋茜", 32, "female")); list.add(new Person("宋哲", 33, "male")); Sex male = new Male(); Sex female = new Female(); Sex andSex = new AndSex(male, female); // 使用不同的标准进行过滤 male.distinguishSex(list); female.distinguishSex(list); // 使用组合标准进行过滤 andSex.distinguishSex(list); } } /** * 标准接口 */ interface Sex { // 辨别性别的方法 public List<Person> distinguishSex(List<Person> list); } /** * 男人判断标准 */ class Male implements Sex { List<Person> list = new ArrayList<>(); @Override public List<Person> distinguishSex(List<Person> list) { for (Person person: list) { if (person.getSex().equalsIgnoreCase("male")){ System.out.println(person.getName()+"是一个男人!"); list.add(person); } } return list; } } /** * 女人判断标准 */ class Female implements Sex { List<Person> list = new ArrayList<>(); @Override public List<Person> distinguishSex(List<Person> list) { for (Person person: list) { if (person.getSex().equalsIgnoreCase("female")){ System.out.println(person.getName()+"是一个女人!"); list.add(person); } } return list; } } /** * 使用标准组合 */ class AndSex implements Sex { private Sex male; private Sex female; public AndSex(Sex male, Sex female) { this.male = male; this.female = female; } /** * 这里要求既是男人,也是女人,形成了互斥,其实并不恰当。 * 现实中使用时,我们可以在定义其他的标准,然后自己进行组合。 * @param list * @return */ @Override public List<Person> distinguishSex(List<Person> list) { List<Person> males = male.distinguishSex(list); return female.distinguishSex(males); } } /** * 在该类上应用标准 */ @Data @AllArgsConstructor class Person { private String name; private Integer age; private String sex; }