1.概述:
允许开发人员根据不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把他们连接起来
2.实际场景
定义一个Person类,拥有姓名(name)、性别(gender)、婚姻状况(marital)三个属性。在实际的系统运用中需要对这三个属性进行不同条件的筛选 比如:
1.获取所有的男生信息
2.获取所有的单身人信息
3.获取所有的已婚人信息
4.获取所有的单身男生信息
5.获取所有的已婚女生信息
3.示例代码
Person类
package com.ven.domain;
/**
* perison
* @author xiaowen
*
*/
public class Person {
//姓名
private String name;
//性别:MALE FEMALE
private String gender;
//婚姻状况:已婚或未婚
private String marital;
public Person(String name, String gender, String marital) {
this.name = name;
this.gender = gender;
this.marital = marital;
}
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 getMarital() {
return marital;
}
public void setMarital(String marital) {
this.marital = marital;
}
}
IFilter接口
package com.ven.service;
import java.util.List;
import com.ven.domain.Person;
/**
* 过滤器接口
* @author xiaowen
*
*/
public interface IFilter {
List<Person> filter(List<Person> persons);
}
根据不同的条件实现过滤器接口
package com.ven.service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.ven.consist.CommonConsist;
import com.ven.domain.Person;
/**
* 男生过滤器
* @author xiaowen
*
*/
public class MaleFilter implements IFilter {
@Override
public List<Person> filter(List<Person> persons) {
List<Person> result = new ArrayList<>();
List<Person> convertResult = persons.stream().filter(person->person.getGender().equals(CommonConsist.GENDER_MALE)).collect(Collectors.toList());
convertResult.forEach(p->{result.add(p);});
return result;
}
}
package com.ven.service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.ven.consist.CommonConsist;
import com.ven.domain.Person;
/**
* 单身过滤器
* @author xiaowen
*
*/
public class SingleFilter implements IFilter {
@Override
public List<Person> filter(List<Person> persons) {
List<Person> result = new ArrayList<>();
List<Person> convertResult = persons.stream().filter(person->person.getMarital().equals(CommonConsist.MARITAL_SINGLE)).collect(Collectors.toList());
convertResult.forEach(p->{result.add(p);});
return result;
}
}
package com.ven.service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.ven.consist.CommonConsist;
import com.ven.domain.Person;
/**
* 单身过滤器
* @author xiaowen
*
*/
public class MarryFilter implements IFilter {
@Override
public List<Person> filter(List<Person> persons) {
List<Person> result = new ArrayList<>();
List<Person> convertResult = persons.stream().filter(person->person.getMarital().equals(CommonConsist.MARITAL_MARRIED)).collect(Collectors.toList());
convertResult.forEach(p->{result.add(p);});
return result;
}
}
package com.ven.service;
import java.util.List;
import com.ven.domain.Person;
/**
* 处理并且逻辑的组合条件过滤器
* @author xiaowen
*
*/
public class FilterAnd implements IFilter {
private IFilter filter;
private IFilter otherFilter;
public FilterAnd(IFilter filter, IFilter otherFilter) {
this.filter = filter;
this.otherFilter = otherFilter;
}
@Override
public List<Person> filter(List<Person> persons) {
List<Person> personList = filter.filter(persons);
List<Person> result = otherFilter.filter(personList);
return result;
}
}
接口常量类
package com.ven.consist;
/**
* 接口常量类
* @author xiaowen
*
*/
public interface CommonConsist {
static final String GENDER_MALE="MALE";
static final String GENDER_FEMALE="FEMALE";
static final String MARITAL_SINGLE="SINGLE";
static final String MARITAL_MARRIED="MARRIED";
}
测试
package com.ven.test;
import java.util.ArrayList;
import java.util.List;
import com.ven.domain.Person;
import com.ven.service.FilterAnd;
import com.ven.service.MaleFilter;
import com.ven.service.MarryFilter;
import com.ven.service.SingleFilter;
/**
* 过滤器模式(Filter)测试
* @author xiaowen
*
*/
public class Test02 {
public static void main(String[] args) {
// 初始化数据
List<Person> persons = new ArrayList<>();
persons.add(new Person("霍一", "FEMALE", "MARRIED"));
persons.add(new Person("邓二", "MALE", "MARRIED"));
persons.add(new Person("张三", "MALE", "SINGLE"));
persons.add(new Person("李四", "FEMALE", "MARRIED"));
persons.add(new Person("王五", "MALE", "SINGLE"));
persons.add(new Person("赵六", "FEMALE", "SINGLE"));
persons.add(new Person("孙七", "MALE", "SINGLE"));
persons.add(new Person("罗八", "MALE", "MARRIED"));
persons.add(new Person("刘九", "FEMALE", "SINGLE"));
persons.add(new Person("史十", "FEMALE", "SINGLE"));
System.out.println("---------------获取所有的男性信息------------------");
List<Person> maleList = new MaleFilter().filter(persons);
maleList.forEach(male->{
System.out.println(male.getName()+"-"+male.getGender()+"-"+male.getMarital());
});
System.out.println("---------------获取所有单身------------------");
List<Person> singleList = new SingleFilter().filter(persons);
singleList.forEach(single->{
System.out.println(single.getName()+"-"+single.getGender()+"-"+single.getMarital());
});
System.out.println("--------------------所有单身的男性-------------------");
List<Person> singleAndMale = new FilterAnd(new MaleFilter(), new SingleFilter()).filter(persons);
singleAndMale.forEach(result->{
System.out.println(result.getName()+"-"+result.getGender()+"-"+result.getMarital());
});
System.out.println("--------------------所有已婚的男性-------------------");
List<Person> marryList = new FilterAnd(new MaleFilter(), new MarryFilter()).filter(persons);
marryList.forEach(marrayAndMale->{
System.out.println(marrayAndMale.getName()+"-"+marrayAndMale.getGender()+"-"+marrayAndMale.getMarital());
});
}
}
控制台信息
---------------获取所有的男性信息------------------
邓二-MALE-MARRIED
张三-MALE-SINGLE
王五-MALE-SINGLE
孙七-MALE-SINGLE
罗八-MALE-MARRIED
---------------获取所有单身------------------
张三-MALE-SINGLE
王五-MALE-SINGLE
赵六-FEMALE-SINGLE
孙七-MALE-SINGLE
刘九-FEMALE-SINGLE
史十-FEMALE-SINGLE
--------------------所有单身的男性-------------------
张三-MALE-SINGLE
王五-MALE-SINGLE
孙七-MALE-SINGLE
--------------------所有已婚的男性-------------------
邓二-MALE-MARRIED
罗八-MALE-MARRIED