0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

过滤器模式是指什么?

冬至子 来源:全栈开发的码农 作者:全栈开发的码农 2023-06-01 14:32 次阅读

过滤器模式是指通过构造一系列不同的标准实现类,通过这些标准实现类把目标对象(通常是多个)按照对应的标准进行过滤,从而得到想要的对象(或对象组)。这些标准实现类也可以构造成多个标准组合的形式(多个标准的“与”、“或”、“非”结合)。

下例中以过滤人员对象为例,人员Person类具有name、gender、maritalStatus等3个属性,在主函数中构造一组人员,使各人员具有不同的属性,然后通过过滤器对这些人员进行过滤。类图如下:

图片

Person类:

package filter;
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;
  }
  public String getInformation() {
    return name+":"+gender+","+maritalStatus;
  }
}

Criteria接口类:

package filter;
import java.util.List;
public interface Criteria {
  List < Person > meetCriteria(List < Person > persons);
}

CriteriaFemale实现类:

package filter;
import java.util.ArrayList;
import java.util.List;
/*
 * 过滤得到女性人员
 */
public class CriteriaFemale implements Criteria{
  @Override
  public List< Person > meetCriteria(List< Person > persons) {
    List < Person > femalePerson = new ArrayList < Person >();
    for(Person person: persons) {
      if(person.getGender().equals("女")) {
        femalePerson.add(person);
      }
    }
    return femalePerson;
  }
}

CriteriaMale实现类:

package filter;
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().equals("男")) {
        malePersons.add(person);
      }
    }
    return malePersons;
  }
}

CriteriaSingle实现类:

package filter;
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().equals("单身")) {
        singlePersons.add(person);
      }
    }
    return singlePersons;
  }
}

Andcriteria实现类:

package filter;
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实现类:

package filter;
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 > firstCriteriaPersons = criteria.meetCriteria(persons);
    List< Person > ohterCriteriaPersons = otherCriteria.meetCriteria(persons);
    for(Person person: ohterCriteriaPersons) {
      if(!firstCriteriaPersons.contains(person)) {
        firstCriteriaPersons.add(person);
      }
    }
    return firstCriteriaPersons;
  }
}

主函数调用类:

package main;
import java.util.ArrayList;
import java.util.List;
import filter.*;
public class FilterPattern {
  public static void main(String[] args) {
    List < Person > persons=new ArrayList < Person > ();
    persons.add(new Person("张三","男","单身"));
    persons.add(new Person("李四","女","已婚"));
    persons.add(new Person("王五","女","单身"));
    persons.add(new Person("赵六","男","已婚"));
    persons.add(new Person("张七","女","单身"));
    persons.add(new Person("李八","男","单身"));
    persons.add(new Person("王九","女","单身"));
    //过滤得到男性
    Criteria male= new CriteriaMale();
    List < Person > malePersons=male.meetCriteria(persons);
    System.out.println("全部男性:");
    for(Person person: malePersons) {
      System.out.println(person.getInformation());
    }
    //过滤得到女性
    Criteria female = new CriteriaFemale();
    List < Person > femalePersons=female.meetCriteria(persons);
    System.out.println("全部女性:");
    for(Person person: femalePersons) {
      System.out.println(person.getInformation());
    }
    //过滤得到单身人士
    Criteria single = new CriteriaSingle();
    List < Person > singlePersons=single.meetCriteria(persons);
    System.out.println("全部单身:");
    for(Person person: singlePersons) {
      System.out.println(person.getInformation());
    }
    //过滤得到单身女性
    Criteria femaleSingle = new AndCriteria(female,single);
    List < Person > femaleSinglePersons=femaleSingle.meetCriteria(persons);
    System.out.println("全部单身女性:");
    for(Person person: femaleSinglePersons) {
      System.out.println(person.getInformation());
    }
    //过滤得到男性或单身人士
    Criteria maleOrSingle = new OrCriteria(male,single);
    List < Person > maleOrSinglePersons=maleOrSingle.meetCriteria(persons);
    System.out.println("全部单身或男性:");
    for(Person person: maleOrSinglePersons) {
      System.out.println(person.getInformation());
    }
  }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 过滤器
    +关注

    关注

    1

    文章

    427

    浏览量

    19537
收藏 人收藏

    评论

    相关推荐

    一文理解布隆过滤器和布谷鸟过滤器

    作者:京东保险 王奕龙 最近在大促中使用到了布隆过滤器,所以本次借着机会整理下相关内容,并了解了布谷鸟过滤器,希望对后续学习的同学有启发~ 布隆过滤器 布隆过滤器是 概率性数据结构 ,
    的头像 发表于 11-07 10:10 568次阅读
    一文理解布隆<b class='flag-5'>过滤器</b>和布谷鸟<b class='flag-5'>过滤器</b>

    CAN过滤器的配置

    CAN过滤器的配置(f103 hal1.8 系列)can的过滤器的配置是对can接收到的报文进行过滤的配置,在STM32芯片中,可以对can的报文进行过滤,从而省略cpu的处理过程。c
    发表于 08-19 06:11

    STM32提供两种过滤器模式

    系列文章目录文章目录系列文章目录前言一、过滤器的作用二、可变的位宽三、屏蔽位模式四、标识符列表模式五、过滤器组位宽和模式的设置六、
    发表于 08-19 07:13

    CN过滤器原理

    CN过滤器原理 CN过滤器采用整体玻璃钢,耐酸耐碱,一般耐温65℃。内部装有约半米高的悬浮介质层。悬浮过滤介质为1-2mm小球,采用高分子材料加工,密度大约
    发表于 02-25 15:00 26次下载

    过滤器的作用

    本视频主要详细介绍了过滤器的作用,分别是滤速高、过滤效果好;强度高、耐腐蚀;静电作用;过滤物质;拦截;其次介绍了水龙头过滤器的作用,最后介绍了活性炭
    的头像 发表于 12-12 16:23 4.4w次阅读

    解密高效空气过滤器的性能及要求

    高效过滤器生产厂商 三河市科丰电气有限公司高效过滤器。三河市科丰电气有限公司致力于为通信行业、暖通行业、节能行业,过滤行业等行业并提供专业配套产品和服务。高效过滤器产品具有
    发表于 03-19 14:56 2017次阅读

    创新陶瓷过滤器解决方案

    创新陶瓷过滤器解决方案
    发表于 10-27 14:56 16次下载

    STM32 CAN应用-过滤器设置

    在使用STM32的CAN控制器进行数据收发,当用到位屏蔽模式的时候,就要设置过滤器了,这个关系到是否能够接收到想要的数据。下面针对几种不同情况对CAN过滤器(Filter)进行设置。
    发表于 02-10 10:00 3次下载
    STM32 CAN应用-<b class='flag-5'>过滤器</b>设置

    丝扣Y过滤器

    丝扣Y过滤器是Y过滤器的一种,普通滤材是不锈钢或者碳钢,滤芯普通带有不锈钢骨架。 丝扣Y形过滤器有时也叫做·不锈钢内螺纹Y过滤器。    特性:   1.丝扣Y形
    的头像 发表于 08-13 17:24 4074次阅读

    丝扣Y过滤器过滤器测试原理简介

    丝扣Y过滤器是Y过滤器的一种,普通滤材是不锈钢或者碳钢,滤芯普通带有不锈钢骨架。 丝扣Y形过滤器有时也叫做·不锈钢内螺纹Y过滤器。  特性: 1.丝扣Y形
    发表于 09-05 09:27 2510次阅读

    丝扣Y形过滤器

    丝扣Y形过滤器是保送介质管道上不可短少的一种安装,通常装置在减压阀、泄压阀、定水位阀或其它设备的进口端,用来消弭介质中的杂质,以维护阀门及设备的正常运用。 丝扣Y形过滤器有时也叫做·不锈钢内螺纹Y
    的头像 发表于 10-24 15:03 3763次阅读

    汉克森过滤器系列介绍

    汉克森过滤器 【1】国产品牌滤芯均为我司生产的替代原厂品牌滤芯,其过滤滤材采用德国原装进口HV公司产品,注册商标为“佳洁”牌。本公司涉及的其它品牌均无品牌意义,只是作为产品型号参照和客户选型对照
    发表于 03-01 08:53 1086次阅读
    汉克森<b class='flag-5'>过滤器</b>系列介绍

    过滤器药液过滤器滤除率测试仪

    过滤器药液过滤器滤除率测试仪
    的头像 发表于 03-09 14:53 822次阅读
    <b class='flag-5'>过滤器</b>药液<b class='flag-5'>过滤器</b>滤除率测试仪

    贝腾过滤器滤芯

    贝腾过滤器滤芯
    的头像 发表于 04-11 15:09 1044次阅读
    贝腾<b class='flag-5'>过滤器</b>滤芯

    杀菌过滤器 灭菌过滤器 除菌过滤器

    杀菌过滤器 灭菌过滤器 除菌过滤器
    的头像 发表于 03-03 14:03 2551次阅读
    杀菌<b class='flag-5'>过滤器</b> 灭菌<b class='flag-5'>过滤器</b> 除菌<b class='flag-5'>过滤器</b>