文章结构 -什么是过滤器模式-意义 -实例 -解释 -图解
过滤器模式:
过滤器模式(Filter Pattern)或者称之为标准模式(Criteria Pattern)这是一种结构型的设计模式,通用不同逻辑之间的运算来实现将他们联系起来,通过结合多种形式的标准来获取单一的标准,就像是逻辑运算符一样,在通过多个逻辑运算之后只是得到了一种结果 如:今天和花10快去按&&今天我花五块钱 那么这个结果经过“与”运算符的出来的结果一定是false;
意义:
存在的意义,加强了一个接口下,多个功能的灵活性,可以更好的拆分下来,用于方法的组合
实例
步骤一:创建顶层类Persion
Person.java
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;
}
}
复制代码
步骤二:创建一个标准的接口并提供一个meetCriteria的集合的人的方法
Criteria.java
import java.util.List;
public interface Criteria {
public List<Person> meetCriteria(List<Person> persons);
}
复制代码
步骤三:给Criteria接口提供具体的实现,每个类里面的方法都有自己的实现
CriteriaMale: 传入一个persons 将该persons里面的男人过滤出来
CriteriaFemale: 传入一个persons 将该persons里面的女人过滤出来
CriteriaSingle: 传入一个persons 将该persons里面的单身的人过滤出来
AndCriteria: 传入两个Criteria的实现类,作为规则 分别调用里面的meet方法 将两种人的分类进行And条件过滤
OrCriteria:传入两个Criteria的实现类,作为规则 分别调用里面的meet方法 将两种人的分类进行Or条件过滤
CriteriaMale.java
import java.util.ArrayList;
import java.util.List;
public class CriteriaMale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> malePersons = new ArrayList<Person>();
for (Person person : persons) {
if(person.getGender().equalsIgnoreCase("MALE")){
malePersons.add(person);
}
}
return malePersons;
}
}
CriteriaFemale.java
import java.util.ArrayList;
import java.util.List;
public class CriteriaFemale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> femalePersons = new ArrayList<Person>();
for (Person person : persons) {
if(person.getGender().equalsIgnoreCase("FEMALE")){
femalePersons.add(person);
}
}
return femalePersons;
}
}
CriteriaSingle.java
import java.util.ArrayList;
import java.util.List;
public class CriteriaSingle implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> singlePersons = new ArrayList<Person>();
for (Person person : persons) {
if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){
singlePersons.add(person);
}
}
return singlePersons;
}
}
AndCriteria.java
import java.util.List;
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);
}
}
OrCriteria.java
import java.util.List;
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;
}
}
复制代码
步骤四:使用不同分类人的方法,将他们结合起来进行过滤
CriteriaPatternDemo.java
import com.jayway.jsonpath.Criteria;
import java.util.ArrayList;
import java.util.List;
public class CriteriaPatternDemo {
public static void main(String[] args) {
List<Person> persons = new ArrayList<Person>();
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()
+" ]");
}
}
}
复制代码
解释+图解: 上面代码我按照图形进行分类分为ABCDEFG (除Proson类)
当我们提供一个标准的集合时:并同时提供四个实现类,且实现类有相同的功能,并且提供了可以将其功能进行组合的方法那么显而易见 A:标准 BCDEF:就是具体的实现 而E:就是调用的Demo
当我需要进行过滤一个集合里面的男人的时候就创建E:的对象调用E的meetCriteria();方法就可以过滤一个男人,当我想过滤一个男人和判断这个男人是单身的时候,可以创建一个B:的对象并且将E:和F:的对象传入就可以做到
图片下载地址
差一个单身类:图比较清晰