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

    文章

    407

    浏览量

    18999
收藏 人收藏

    评论

    相关推荐

    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次下载

    使用Mipmap的2个优点分析

    Mipmap是纹理图像的较小的预滤波变体,表示纹理的不同细节层次(LOD)。通过使用mipmap的缩小过滤器模式,Graphics Core可以设置为自动计算哪个LOD最接近将mipmap的纹理元素映射到渲染目标中的像素,并使用正确的mipmap 进行纹理化。
    的头像 发表于 02-06 16:26 4689次阅读

    过滤器的作用

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

    丝扣Y过滤器

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

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

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

    丝扣Y形过滤器

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

    法兰Y型过滤器

    法兰Y型过滤器是除去液体中少量固体颗粒的小型设备,可维护设备的正常工作,当流体进入置有   规格滤网的滤筒后,其杂质被阻挠,而清洁的滤液则由过滤器出口排出,当需求清洗时,只需将可拆卸的滤筒取出,处置
    的头像 发表于 10-24 15:04 1708次阅读

    Y型过滤器

    Y型过滤器是保送介质的管道系统不可短少的一种过滤安装,Y型过滤器通常装置在减压阀、泄压阀、定水位阀或其它设备的进口端,用来   介质中的杂质,以维护阀门及设备的正常运用。Y型过滤用具有
    发表于 10-25 15:32 1906次阅读

    LabVIEW统一查询工具包 过滤器模式Por的介绍

    2、C#里面有统一查询语言(LINQ),里面包含数据查询、集合查询、以及排序,这篇文章也来开发一个LabVIEW的统一查询工具包,实现以上功能。
    的头像 发表于 11-28 09:52 1102次阅读

    科普一下12种管道过滤器

    Y型过滤器属于管道粗过滤器,可用于液体、气体或其他介质大颗粒物过滤
    的头像 发表于 01-12 09:57 4971次阅读

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

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

    贝腾过滤器滤芯

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

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

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