java 设计模式之过滤器模式(Filter)

来源:互联网 发布:开淘宝企业店需要什么 编辑:程序博客网 时间:2024/06/04 19:33

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 FEMALEprivate 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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;}@Overridepublic 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








0 0