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
- java 设计模式之过滤器模式(Filter)
- 设计模式:Filter过滤器
- 【设计模式 - 7】之过滤器模式(Filter)
- Java设计模式——过滤器模式(Filter Pattern)
- java设计模式之过滤器模式
- 设计模式【过滤器模式Filter Pattern】
- 【设计模式】过滤器模式(Filter Pattern)
- Java Filter Pattern(过滤器模式)
- 设计模式之过滤器模式
- 设计模式之过滤器模式
- 设计模式之过滤器模式
- 过滤器模式-Filter Pattern
- 【设计模式】拦截过滤器模式(Intercepting Filter Pattern)
- 设计模式学习之过滤器模式
- [设计模式](九):过滤器模式(Filter)及Kotlin的Filter模式
- 设计模式--过滤器模式
- 设计模式-过滤器模式
- Java之Filter过滤器
- Linux下keepalived安装与配置
- BottomSheetBehavior
- [题解]bzoj1875(SDOI2009)HH去散步
- Java实现动态表查找--二叉排序树
- linux tail 命令详解
- java 设计模式之过滤器模式(Filter)
- FP增长算法(FP Growth Algorithm)
- Centos在VM中不能全屏问题
- 网易新闻客户端链接
- 程序员职业能窥探其他职业,反之...
- 用CSS解决左右两块布局时,分界线跟随二者中高度大的变化
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- Java基础学习总结(100)——Dbunit入门简介
- 新手教你centOS 6.5下面如何安装Oracle 11g(通用版)