设计模式详解-过滤器模式(标准模式)

这篇具有很好参考价值的文章主要介绍了设计模式详解-过滤器模式(标准模式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

导言

在软件开发中,我们常常需要对大量的数据进行筛选或过滤。例如,在一个电子商务网站中,我们可能需要根据用户的喜好、价格区间、商品类型等条件来筛选出符合用户需求的商品列表。为了实现这样的功能,过滤器模式就派上了用场。

什么是过滤器模式?

过滤器模式是一种结构型设计模式,它允许我们使用不同的条件从数据集合中筛选出满足特定条件的数据子集。它将筛选条件和数据集合分离,使得二者可以独立变化而互不影响。

过滤器模式的组成部分

过滤器接口(Filter):定义了过滤器的基本方法,在实际应用中可以扩展该接口以适应不同的过滤条件。
具体过滤器(ConcreteFilter):实现过滤器接口,根据具体的条件对数据进行过滤。
过滤器链(FilterChain):将多个过滤器按照一定的顺序组合起来,形成一个过滤器链,依次对数据进行过滤。

过滤器模式的应用场景

过滤器模式在很多实际场景中都有应用,例如:

  • 数据查询:在数据库查询中,我们可以使用过滤器模式根据不同的条件对查询结果进行过滤,提高查询效率。
  • 日志过滤:在日志系统中,我们可以使用过滤器模式根据级别、关键词等条件对日志进行过滤,方便问题排查与分析。
  • 图像处理:在图像处理中,我们可以使用过滤器模式根据不同的条件对图像进行滤波、增强等操作。

过滤器模式的实现

步骤 1
        创建一个类,在该类上应用标准。

        Person.java
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;
    }
}
步骤 2
        为标准(Criteria)创建一个接口。

        Criteria.java
        import java.util.List;

public interface Criteria {
    public List<Person> meetCriteria(List<Person> persons);
}
步骤 3
        创建实现了 Criteria 接口的实体类。

        CriteriaMale.java
        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().equalsIgnoreCase("MALE")){
                malePersons.add(person);
            }
        }
        return malePersons;
    }
}
CriteriaFemale.java
        import java.util.ArrayList;
        import java.util.List;

public class CriteriaFemale implements Criteria {

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> femalePersons = new ArrayList<Person>();
        for (Person person : persons) {
            if(person.getGender().equalsIgnoreCase("FEMALE")){
                femalePersons.add(person);
            }
        }
        return femalePersons;
    }
}
CriteriaSingle.java
        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().equalsIgnoreCase("SINGLE")){
                singlePersons.add(person);
            }
        }
        return singlePersons;
    }
}
AndCriteria.java
        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.java
        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> firstCriteriaItems = criteria.meetCriteria(persons);
        List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);

        for (Person person : otherCriteriaItems) {
            if(!firstCriteriaItems.contains(person)){
                firstCriteriaItems.add(person);
            }
        }
        return firstCriteriaItems;
    }
}
步骤4
        使用不同的标准(Criteria)和它们的结合来过滤 Person 对象的列表。

        CriteriaPatternDemo.java
        import java.util.ArrayList;
        import java.util.List;

public class CriteriaPatternDemo {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<Person>();

        persons.add(new Person("Robert","Male", "Single"));
        persons.add(new Person("John","Male", "Married"));
        persons.add(new Person("Laura","Female", "Married"));
        persons.add(new Person("Diana","Female", "Single"));
        persons.add(new Person("Mike","Male", "Single"));
        persons.add(new Person("Bobby","Male", "Single"));

        Criteria male = new CriteriaMale();
        Criteria female = new CriteriaFemale();
        Criteria single = new CriteriaSingle();
        Criteria singleMale = new AndCriteria(single, male);
        Criteria singleOrFemale = new OrCriteria(single, female);

        System.out.println("Males: ");
        printPersons(male.meetCriteria(persons));

        System.out.println("\nFemales: ");
        printPersons(female.meetCriteria(persons));

        System.out.println("\nSingle Males: ");
        printPersons(singleMale.meetCriteria(persons));

        System.out.println("\nSingle Or Females: ");
        printPersons(singleOrFemale.meetCriteria(persons));
    }

    public static void printPersons(List<Person> persons){
        for (Person person : persons) {
            System.out.println("Person : [ Name : " + person.getName()
                    +", Gender : " + person.getGender()
                    +", Marital Status : " + person.getMaritalStatus()
                    +" ]");
        }
    }
}
步骤 5
        执行程序,输出结果:

        Males:
        Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
        Person : [ Name : John, Gender : Male, Marital Status : Married ]
        Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
        Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]

        Females:
        Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
        Person : [ Name : Diana, Gender : Female, Marital Status : Single ]

        Single Males:
        Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
        Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
        Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]

        Single Or Females:
        Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
        Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
        Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
        Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
        Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
        
这段代码展示了一个使用标准模式(Criteria Pattern)的例子。标准模式用于按照特定的标准筛选对象。

步骤1中定义了一个名为Person的类,该类具有name、gender和maritalStatus属性,并提供了相应的构造函数和访问方法。

步骤2中定义了一个名为Criteria的接口,该接口包含一个meetCriteria方法,用于根据特定的标准筛选Person对象。

步骤3中定义了几个实现了Criteria接口的类,分别用于筛选男性、女性和单身人士的Person对象。还定义了AndCriteriaOrCriteria类,用于组合不同的标准进行筛选。

步骤4中使用不同的标准和它们的组合来过滤Person对象的列表。在示例中,创建了一个包含多个Person对象的列表,然后使用不同的标准对该列表进行筛选,并打印出符合相应标准的Person对象。

步骤5中执行程序,根据不同的标准筛选并输出结果。可以看到,根据不同的标准筛选后,输出的Person对象列表符合对应的要求。

标准模式可以很好地实现对象的筛选和过滤,提供了灵活性和可扩展性,使得筛选逻辑与具体对象的实现解耦。这对于需要根据不同的标准进行筛选的应用场景非常有用。

结语

过滤器模式是一种简单而强大的软件设计模式,它可以帮助我们灵活地筛选数据,并将过滤条件与数据集合解耦。通过本篇博客的学习,读者可以了解到过滤器模式的基本概念、应用场景和实现方式,并通过实例演示掌握其具体使用方法。希望本文对您深入理解过滤器模式有所帮助,并能在实际开发中灵活运用。文章来源地址https://www.toymoban.com/news/detail-659317.html

到了这里,关于设计模式详解-过滤器模式(标准模式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 布隆过滤器详解

    本文全部代码地址 布隆过滤器是一种高效的数据结构,用于判断一个元素是否存在于一个集合中.它的主要优点是速度快,空间占用少,因此在需要快速判断某个元素是否在集合中的场合得到广泛引用. 布隆过滤器就是 一个大型的位数组和几个不一样的无偏hash函数. 所谓无偏就是

    2023年04月22日
    浏览(54)
  • JavaWeb过滤器(Filter)详解,是时候该把过滤器彻底搞懂了(万字说明)

            注意:这篇文章很长,学习完后将会解决你对于过滤器(Filter)的所有疑惑,下面将通过理论和代码的结合来进行讲解演示.....    目录 基本介绍 过滤器原理 过滤器(Filter)接口 使用过滤器(Filter) 创建过滤器(Fliter) 使用过滤器(Filter) 配置过滤器(Filter)拦截路径  注解方式

    2024年02月02日
    浏览(41)
  • Java 过滤器 @WebFilter 详解

    @WebFilter 注解是JavaEE中的一种注解,用于标识一个类为过滤器(Filter)。过滤器用于对请求进行过滤和处理,可以在请求到达目标资源之前或之后执行一些操作。 使用**@WebFilter**注解可以将一个类声明为过滤器,并指定过滤器的名称、URL模式、Servlet名称等。 简化配置 :不再需要

    2024年02月03日
    浏览(44)
  • Fiddler过滤器 Filters 详解

    目录 前言: 一、 Hosts 过滤 (较常用) 二、Client Process 过滤(客户端进程过滤,通过配置只过滤/不过滤哪些进程的请求。用的不多) 三、Request Headers (根据请求头信息进行过滤。常用) 四、Breakpionts 设置断点(很少用,毕竟可以通过 bpu、bpafter以及改写规则js设置断点)

    2024年02月12日
    浏览(50)
  • 品味布隆过滤器的设计之美

    布隆过滤器是一个精巧而且经典的数据结构。 你可能没想到: RocketMQ、 Hbase 、Cassandra 、LevelDB 、RocksDB 这些知名项目中都有布隆过滤器的身影。 对于后端程序员来讲,学习和理解布隆过滤器有很大的必要性。来吧,我们一起品味布隆过滤器的设计之美。 我们先来看一个商品

    2023年04月14日
    浏览(29)
  • Spring Security内置过滤器详解

    相关文章: OAuth2的定义和运行流程 Spring Security OAuth实现Gitee快捷登录 Spring Security OAuth实现GitHub快捷登录 Spring Security的过滤器链机制 Spring Security OAuth Client配置加载源码分析 根据前面的示例,我们已经知道启动时会加载18个过滤器,并且已经知道了请求会匹配到DefaultSecurityF

    2024年02月05日
    浏览(49)
  • gateway之过滤器(Filter)详解

    在Spring Cloud中,过滤器(Filter)是一种关键的组件,用于在微服务架构中处理和转换传入请求以及传出响应。过滤器位于服务网关或代理中,并通过拦截请求和响应流量来提供各种功能。 过滤器在请求的不同生命周期阶段执行特定的操作,例如鉴权、认证、请求转发、限流、

    2024年02月05日
    浏览(44)
  • Spring Cloud Gateway 过滤器详解

    Spring Cloud Gateway根据作用范围划分为:GatewayFilter和GlobalFilter 由filter工作流程点,可以知道filter有着非常重要的作用,在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输

    2023年04月08日
    浏览(40)
  • Vue2中过滤器的用法详解

    目录 一、过滤器的概念 二、过滤器的使用位置 三、过滤器的分类 1、全局过滤器 2、本地过滤器 四、过滤器应用实例 1、使用过滤器实现省略号 2、使用过滤器处理时间戳 五、Vue3中已废弃过滤器  过滤器 是vue中的一个特性,作用是用于对文本进行格式化的作用。分为全局过

    2024年02月07日
    浏览(42)
  • SpringBoot之过滤器Filter详解及登录校验

    目录 1 快速入门 2.Filter详解 2.1 执行流程 2.2 拦截路径 2.3 过滤器链 3.登录校验-Filter 3.1 分析 3.2 具体流程 3.3 代码实现 什么是Filter? Filter表示过滤器,是 JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能 使用了过滤器

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包