Java Filter Pattern(过滤器模式)

简介: 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。

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

  1. 创建一个类,在该类上应用标准。
/**
 * 1. 创建一个类,在该类上应用标准。
 * @author mazaiting
 */
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;
    }   
}
  1. 为标准(Criteria)创建一个接口。
/**
 * 2. 为标准(Criteria)创建一个接口
 * @author mazaiting
 */
public interface Critertia {
    /**男性*/
    public static final String MALE = "MALE";
    /**女性*/
    public static final String FEMALE = "FEMALE";
    /**单身*/
    public static final String SINGLE = "SINGLE";
    
    /**
     * 获取指定的人群
     * @param persons
     */
    public List<Person> meetCriteria(List<Person> persons);
}
  1. 创建实现了 Criteria 接口的实体类。
/**
 * 3. 创建实现了 Criteria 接口的实体类--过滤男性。
 * @author mazaiting
 */
public class CriteriaMale implements Critertia{

    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;
    }

}

/**
 * 3. 创建实现了 Criteria 接口的实体类。--过滤女性
 * @author mazaiting
 */
public class CriteriaFemale implements Critertia{

    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;
    }

}

/**
 * 3. 创建实现了 Criteria 接口的实体类。--过滤单身
 * @author mazaiting
 */
public class CriteriaSingle implements Critertia{

    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;
    }

}

/**
 * 3. 创建实现了 Criteria 接口的实体类。--双重过滤
 * @author mazaiting
 */
public class AndCriteria implements Critertia{

    private Critertia critertia;
    private Critertia otherCritertia;
    
    public AndCriteria(Critertia critertia, Critertia otherCriteria) {
        this.critertia = critertia;
        this.otherCritertia = otherCriteria;
    }
    
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> firstCriteriaPersons = critertia.meetCriteria(persons);
        return otherCritertia.meetCriteria(firstCriteriaPersons);
    }

}

/**
 * 3. 创建实现了 Criteria 接口的实体类。--或过滤
 * @author mazaiting
 */
public class OrCriteria implements Critertia{

    private Critertia critertia;
    private Critertia otherCritertia;
    
    public OrCriteria(Critertia critertia, Critertia otherCritertia) {
        this.critertia = critertia;
        this.otherCritertia = otherCritertia;
    }
    
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> firstCriteriaItems = critertia.meetCriteria(persons);
        List<Person> otherCriteriaItems = otherCritertia.meetCriteria(persons);
        
        for (Person person : otherCriteriaItems) {
            if (!firstCriteriaItems.contains(person)) {
                firstCriteriaItems.add(person);
            }
        }
        
        return firstCriteriaItems;
    }

}
  1. 主函数验证
public class Client {
    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"));
        
        Critertia male = new CriteriaMale();
        Critertia single = new CriteriaSingle();
        Critertia critertia = new AndCriteria(male, single);
        
        List<Person> meetCriteria = critertia.meetCriteria(persons);
        printPersons(meetCriteria);
        
    }
    
    /**
     * 打印数据
     * @param 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()
                +" ]");
          }
       } 
}
  1. 打印结果
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
目录
相关文章
|
10月前
|
存储 Java 大数据
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用(198)
简介:本文探讨Java大数据技术在智能家居能源消耗分析与节能策略中的应用。通过数据采集、存储与智能分析,构建能耗模型,挖掘用电模式,制定设备调度策略,实现节能目标。结合实际案例,展示Java大数据在智能家居节能中的关键作用。
|
10月前
|
Java 应用服务中间件 Docker
java-web部署模式概述
本文总结了现代 Web 开发中 Spring Boot HTTP 接口服务的常见部署模式,包括 Servlet 与 Reactive 模型、内置与外置容器、物理机 / 容器 / 云环境部署及单体与微服务架构,帮助开发者根据实际场景选择合适的方案。
554 25
|
供应链 JavaScript 前端开发
Java基于SaaS模式多租户ERP系统源码
ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平,它是一种先进的企业管理理念和信息化管理系统。 适用于小微企业的 SaaS模式多租户ERP管理系统, 采用最新的技术栈开发, 让企业简单上云。专注于小微企业的应用需求,如企业基本的进销存、询价,报价, 采购、销售、MRP生产制造、品质管理、仓库库存管理、财务应收付款, OA办公单据、CRM等。
853 23
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
|
监控 Java 数据管理
java会话跟踪和拦截器过滤器
本文介绍了Web开发中的会话跟踪技术——Cookie与Session,以及过滤器(Filter)和监听器(Listener)的概念和应用。Cookie通过在客户端记录信息来识别用户,而Session则在服务器端保存用户状态。过滤器用于拦截和处理请求及响应,监听器则监控域对象的状态变化。文章详细解释了这些技术的实现方式、应用场景和主要方法,帮助开发者更好地理解和使用这些工具。
291 1
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
197 0
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
351 11
|
监控 前端开发 Java
Java里的过滤器和拦截器是什么原理,如何选择?
Java里的过滤器和拦截器是什么原理,如何选择?
444 0
|
Web App开发 Java 容器
|
7月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
370 1