过滤器模式【Java设计模式】

简介: 过滤器模式【Java设计模式】

前言


2022/9/23 14:06

路漫漫其修远兮,吾将上下而求索


本文是根据袁庭新老师学习所做笔记

仅供学习交流使用,转载注明出处

推荐

袁庭新老师-视频:【Java设计模式】23种Java设计模式,全网最全精讲版本,熬夜爆肝也要学完【10:06:48】

狂神老师-笔记:设计模式【java提高】

过滤器模式

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单―标准。

缺点:代码过于冗余

实现

我们将创建一个Person对象、Criteria接口和实现了该接口的实体类,来过滤Person对象的列表。CriteriaPatternDemo类使用Criteria对象,基于各种标准和它们的结合来过滤Person对象的列表。

1.创建一个项目名称为criteria_pattern的Java项目。

2.创建—个Person类,在该类上应用标准。

package com.js;
public class Person {
    private String name;
    private String gender;
    //婚姻状态:single单身、marital表示已婚
    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 void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getMaritalStatus() {
        return maritalStatus;
    }
    public void setMaritalStatus(String maritalStatus) {
        this.maritalStatus = maritalStatus;
    }
  @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", maritalStatus='" + maritalStatus + '\'' +
                '}';
    }
}

3.创建过滤规则接口

package com.js;
import java.util.List;
/**
 * 过滤器的接口(标准接口)
 */
public interface Criteria {
    /**
     * 实现的符号指定的过滤条件的方法,需要将对应的Person对象
     * 以参数的形式进行传递
     */
    /**
     * 方法表示一个过滤的方法
     * @param persons 被过滤的对象
     * @return 满足条件的对象的集合
     */
    List<Person> meetCriteria(List<Person> persons); 
}

4.编写过滤实现类

package com.js;
import java.util.ArrayList;
import java.util.List;
/**
 * 男性过滤类
 */
public class CriteriaMale implements Criteria{
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        /**
         * male、female
         */
        List<Person> malePersons=new ArrayList<>();
        for (Person person : persons){
            if (person.getGender().equalsIgnoreCase("male")){
                malePersons.add(person);
            }
        }
        return malePersons;
    }
}
package com.js;
import java.util.ArrayList;
import java.util.List;
/**
 * 女性过滤类
 */
public class CriteriaFemale implements Criteria{
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        /**
         * male、female
         */
        List<Person> femalePersons =new ArrayList<>();
        for (Person person : persons){
            if (person.getGender().equalsIgnoreCase("female")){
                femalePersons.add(person);
            }
        }
        return femalePersons;
    }
}
package com.js;
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<>();
        for (Person person : persons){
            if (person.getMaritalStatus().equalsIgnoreCase("single")){
                singlePersons.add(person);
            }
        }
        return singlePersons;
    }
}
package com.js;
import java.util.ArrayList;
import java.util.List;
public class CriteriaMarital implements Criteria{
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> maritalPersons =new ArrayList<>();
        for (Person person : persons){
            if (person.getMaritalStatus().equalsIgnoreCase("marital")){
                maritalPersons.add(person);
            }
        }
        return maritalPersons;
    }
}

多条件过滤与AND

package com.js;
import java.util.ArrayList;
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> firstPersons =new ArrayList<>();
        List<Person> secondPersons =new ArrayList<>();
        firstPersons = criteria.meetCriteria(persons);
        secondPersons = otherCriteria.meetCriteria(firstPersons);
        return secondPersons;
    }
}

多条件过滤或OR

package com.js;
import java.util.ArrayList;
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> firstPersons =new ArrayList<>();
        List<Person> secondPersons =new ArrayList<>();
        firstPersons = criteria.meetCriteria(persons);
        secondPersons = otherCriteria.meetCriteria(persons);
        for (Person person : secondPersons){
            if (!firstPersons.contains(person)){
                firstPersons.add(person);
            }
        }
        return firstPersons;
    }
}

5.创建程序入口

package com.js;
import java.util.ArrayList;
import java.util.List;
public class FilterPatternDemo {
    public static void main(String[] args) {
        //构建一个List集合,然后在这个集合中保存不同person信息的对象
        List<Person> peoples=new ArrayList<>();
        Person p1= new Person("张三","male","single");
        Person p2= new Person("李四","female","marital");
        Person p3= new Person("王五","female","single");
        Person p4= new Person("赵六","male","marital");
        Person p5= new Person("张三","male","single");
        Person p6= new Person("张三","male","single");
        Person p7= new Person("张三","male","marital");
        peoples.add(p1);
        peoples.add(p2);
        peoples.add(p3);
        peoples.add(p4);
        peoples.add(p5);
        peoples.add(p6);
        peoples.add(p7);
        //创建一个过滤器对象(male筛选出来)
        CriteriaMale male=new CriteriaMale();
        List<Person> males = male.meetCriteria(peoples);
        System.out.println(males);
        System.out.println("--------------------");
        CriteriaSingle single=new CriteriaSingle();
        List<Person> singles = single.meetCriteria(peoples);
        System.out.println(singles);`在这里插入代码片`
        System.out.println("--------------------");
        AndCriteria and=new AndCriteria(male,single);
        List<Person> ands = and.meetCriteria(peoples);
        System.out.println(ands);
    }
}

6.结果

[Person{name='张三', gender='male', maritalStatus='single'}, Person{name='赵六', gender='male', maritalStatus='marital'}, Person{name='张三', gender='male', maritalStatus='single'}, Person{name='张三', gender='male', maritalStatus='single'}, Person{name='张三', gender='male', maritalStatus='marital'}]
--------------------
[Person{name='张三', gender='male', maritalStatus='single'}, Person{name='王五', gender='female', maritalStatus='single'}, Person{name='张三', gender='male', maritalStatus='single'}, Person{name='张三', gender='male', maritalStatus='single'}]
--------------------
[Person{name='张三', gender='male', maritalStatus='single'}, Person{name='张三', gender='male', maritalStatus='single'}, Person{name='张三', gender='male', maritalStatus='single'}]

最后


2022/9/23 14:55


p7


Markdown 6153 字数 363 行数

HTML 5831 字数 237 段落

相关文章
|
6天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
42 4
|
2月前
|
设计模式 安全 Java
Kotlin - 改良设计模式 - 构建者模式
Kotlin - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
47 1
|
2月前
|
监控 Java 数据管理
java会话跟踪和拦截器过滤器
本文介绍了Web开发中的会话跟踪技术——Cookie与Session,以及过滤器(Filter)和监听器(Listener)的概念和应用。Cookie通过在客户端记录信息来识别用户,而Session则在服务器端保存用户状态。过滤器用于拦截和处理请求及响应,监听器则监控域对象的状态变化。文章详细解释了这些技术的实现方式、应用场景和主要方法,帮助开发者更好地理解和使用这些工具。
50 1
|
3月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
58 0
[Java]23种设计模式
|
2月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。