08-Java过滤器模式 ( Filter Pattern )
Java过滤器模式
- 实现
- 范例
-
过滤器模式(Filter Pattern)或允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来
-
过滤器模式(Filter Pattern) 又称 标准模式(Criteria Pattern)
过滤器模式属于结构型模式,它结合多个标准来获得单一标准
实现

- 创建一个
Person对象、Criteria接口和实现了该接口的实体类,来过滤Person对象的列表; CriteriaPatternDemo使用Criteria对象,基于各种标准和它们的结合来过滤Person对象的列表;
范例
1. 创建一个类,在该类上应用标准.
Person.java
package com.demo.gof;
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
package com.demo.gof;
import java.util.List;public interface Criteria {public List<Person> meetCriteria(List<Person> persons);
}
3. 创建实现了 Criteria 接口的实体类
CriteriaMale.java
package com.demo.gof;
import java.util.ArrayList;
import java.util.List;public class CriteriaMale implements Criteria {@Overridepublic 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
package com.demo.gof;
import java.util.ArrayList;
import java.util.List;public class CriteriaFemale implements Criteria {@Overridepublic 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
package com.demo.gof;
import java.util.ArrayList;
import java.util.List;public class CriteriaSingle implements Criteria {@Overridepublic 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
package com.demo.gof;
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; }@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> firstCriteriaPersons = criteria.meetCriteria(persons); return otherCriteria.meetCriteria(firstCriteriaPersons);}
OrCriteria.java
package com.demo.gof;
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; }@Overridepublic 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
package com.demo.gof;
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()+" ]");}}
}
编译运行以上 Java 范例,输出结果如下
$ javac -d . src/main/com.demo/gof/CriteriaPatternDemo.java
$ java com.demo.gof.CriteriaPatternDemo
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 ]相关文章:
08-Java过滤器模式 ( Filter Pattern )
Java过滤器模式 实现范例 过滤器模式(Filter Pattern)或允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 过滤器模式(Filter Pattern) 又称 标准模式(Criteria Pattern…...
ChatGPT高效提问—prompt常见用法(续篇八)
ChatGPT高效提问—prompt常见用法(续篇八) 1.1 对抗 对抗是一个重要主题,深入探讨了大型语言模型(LLM)的安全风险。它不仅反映了人们对LLM可能出现的风险和安全问题的理解,而且能够帮助我们识别这些潜在的风险,并通过切实可行的技术手段来规避。 截至目前,网络…...
微软.NET6开发的C#特性——接口和属性
我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,下面我就重点讲讲微软.NET6开发人员需要知道的C#特性,然后比较其他各种语言进行认识。 C#经历了多年发展…...
容器基础知识:容器和虚拟化的区别
虚拟化与容器化对比 容器化和虚拟化都是用于优化资源利用率并实现高效应用程序部署的技术。然而,它们在方法和关键特征上存在差异: 虚拟化: 可以理解为创建虚拟机 (VM)。虚拟机模拟一台拥有自己硬件(CPU、内存、存储)和操作系统…...
【Linux】vim的基本操作与配置(下)
Hello everybody!今天我们继续讲解vim的操作与配置,希望大家在看过这篇文章与上篇文章后都能够轻松上手vim! 1.补充 在上一篇文章中我们说过了,在底行模式下set nu可以显示行号。今天补充一条:set nonu可以取消行号。这两条命令大家看看就可…...
[office] 图文演示excel怎样给单元格添加下拉列表 #知识分享#经验分享
图文演示excel怎样给单元格添加下拉列表 在Excel表格中输入数据的时候,为了简便快捷的输入,经常需要给Excel单元格添加一个下拉菜单,这样在输入数据时不必按键盘,只是用鼠标选择选项就可以了。 比的位置。 4、可以看到一个预览的…...
【RT-DETR有效改进】利用SENetV2重构化网络结构 (ILSVRC冠军得主,全网独家首发)
👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是SENetV2,其是2023.11月的最新机制(所以大家想要发论文的可以在上面下点功夫),其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型,而…...
【Linux】学习-进程间通信
进程间通信 介绍 进程间通信的本质 进程间通信的前提,首先需要让不同的进程看到同一块“内存”此“内存”一定不属于任何进程,而应该强调共享二字 进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:…...
45. C++ 字符指针和字符串
一、字符指针可以指向一个字符串。 我们可以用字符串常量对字符指针进行初始化。例如,有说明语句: char *str "This is a string.";是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符…...
如何制作一款3D FPS游戏
制作一款3D FPS游戏是一个复杂的过程,需要涵盖多个方面,包括游戏设计、游戏引擎选择、模型制作、音效制作、关卡设计等。下面是一个关于如何制作一款3D FPS游戏的超长文章。 游戏设计 首先,你需要确定游戏的整体设计和核心玩法。这包括游戏的…...
人工智能|深度学习——使用多层级注意力机制和keras实现问题分类
代码下载 使用多层级注意力机制和keras实现问题分类资源-CSDN文库 1 准备工作 1.1 什么是词向量? ”词向量”(词嵌入)是将一类将词的语义映射到向量空间中去的自然语言处理技术。即将一个词用特定的向量来表示,向量之间的距离(例…...
C语言常见面试题:C语言中如何进行网页开发编程?
在C语言中进行网页开发通常不是一个直接的过程,因为C语言主要用于系统级编程,而不是Web开发。传统的Web开发主要使用高级语言如JavaScript、Python、Ruby、PHP等,以及与Web相关的技术,如HTML、CSS和数据库。 然而,如果…...
DevOps落地笔记-20|软件质量:决定系统成功的关键
上一课时介绍通过提高工程效率来提高价值交付效率,从而提高企业对市场的响应速度。在提高响应速度的同时,也不能降低软件的质量,这就是所谓的“保质保量”。具备高质量软件,高效率的企业走得更快更远。相反,低劣的软件…...
政安晨:梯度与导数~示例演绎《机器学习·神经网络》的高阶理解
这篇文章确实需要一定的数学基础,第一次接触的小伙伴可以先看一下我示例演绎这个主题的前两篇文章: 示例演绎机器学习中(深度学习)神经网络的数学基础——快速理解核心概念(一): 政安晨&#…...
CTFSHOW命令执行web入门29-54
description: >- 这里就记录一下ctfshow的刷题记录是web入门的命令执行专题里面的题目,他是有分类,并且覆盖也很广泛,所以就通过刷这个来,不过里面有一些脚本的题目发现我自己根本不会笑死。 如果还不怎么知道写题的话,可以去看我的gitbook,当然csdn我也转载了我自己的…...
探索ChatGPT4:新一代人工智能语言模型的突破
ChatGPT4,作为最新一代的语言处理模型,代表了人工智能在自然语言理解和生成方面的最新突破。本文将深入介绍ChatGPT4的新特性,探讨其在各个领域的潜在应用。 ChatGPT4概述 在继承了前一代模型的强大基础之上,ChatGPT4引入了多项…...
PVST详解
PVST(Per-VLAN Spanning Tree)是Cisco公司的一种扩展的Spanning Tree协议,允许在每个VLAN中独立运行一个Spanning Tree实例,从而提高网络的可靠性和性能。 PVST协议在每个交换机中维护多个Spanning Tree实例,每个实例…...
c++ 子进程交互 逻辑
目录 一、主进程逻辑 1、创建子进程时候,写入自己的HWND 2、响应子进程消息...
C#实现矩阵乘法
目录 一、使用的方法 1.矩阵 2.矩阵的乘法原理 二、实例 1.源码 2.生成效果 一、使用的方法 矩阵相当于一个数组,主要用来存储一系列数,例如,mn矩阵是排列在m行和n列中的一系列数,mn矩阵可与一个np矩阵相乘,结果…...
Objective-C 中的SEL
在 Objective-C 中,SEL(Selector)是一种用来表示方法的类型。 它实际上是一个指向方法的指针,用于在运行时动态调用方法。 下面是一个使用 SEL 的代码示例: #import <Foundation/Foundation.h>interface MyCl…...
SDMatte在老旧照片修复流程中的关键作用:人物与背景分离
SDMatte在老旧照片修复流程中的关键作用:人物与背景分离 1. 老照片修复的挑战与解决方案 老照片承载着珍贵的记忆,但时间往往会在这些影像上留下痕迹——褪色、划痕、污渍甚至物理破损。传统修复方法需要专业设计师耗费大量时间手动处理,而…...
WikiJS全文搜索实战:用ElasticSearch+IK分词器提升内容检索效率(Docker版)
WikiJS全文搜索实战:ElasticSearch与IK分词器的深度优化指南 引言:为什么需要专业级全文搜索解决方案? 想象一下,当你面对一个包含数千篇技术文档的Wiki系统时,传统的关键词匹配就像在黑暗房间里寻找一根针。WikiJS自带…...
GME-Qwen2-VL-2B助力AIGC内容创作:自动为图片生成创意文案与故事
GME-Qwen2-VL-2B助力AIGC内容创作:自动为图片生成创意文案与故事 你有没有过这样的经历?面对一张精心拍摄的照片,却怎么也憋不出几句像样的文案。或者,看着一张充满故事感的图片,脑海里思绪万千,落到笔尖却…...
UE5.3与Colosseum集成配置指南及常见问题解析
1. 环境准备:Windows系统下的基础配置 在开始Colosseum与UE5.3的集成之前,我们需要确保开发环境满足基本要求。我最近在Windows 11系统上完成了一次完整配置,实测下来这几个关键组件版本组合最稳定: 操作系统:Windows …...
MeetingBar AppleScript自动化:会议开始前自动暂停音乐的终极指南
MeetingBar AppleScript自动化:会议开始前自动暂停音乐的终极指南 【免费下载链接】MeetingBar 🇺🇦 Your meetings at your fingertips in the macOS menu bar 项目地址: https://gitcode.com/gh_mirrors/me/MeetingBar MeetingBar是…...
AutoDL云服务器避坑指南:从PyTorch到Jupyter,手把手搞定GPU环境配置
AutoDL云服务器GPU环境配置实战:从镜像选择到Jupyter避坑全攻略 第一次在AutoDL这类云GPU平台上配置深度学习环境时,那种既兴奋又忐忑的心情我至今记忆犹新。看着琳琅满目的镜像选项和复杂的版本匹配要求,稍有不慎就会陷入"版本地狱&qu…...
3步搞定!Jable视频下载终极指南:免费Chrome插件+本地工具完整教程
3步搞定!Jable视频下载终极指南:免费Chrome插件本地工具完整教程 【免费下载链接】jable-download 方便下载jable的小工具 项目地址: https://gitcode.com/gh_mirrors/ja/jable-download Jable视频下载工具是一款专为普通用户设计的免费开源解决方…...
CHORD-X从零开始:C语言基础概念学习报告自动生成教程
CHORD-X从零开始:C语言基础概念学习报告自动生成教程 你是不是也遇到过这样的烦恼?作为编程老师,每次讲完C语言的指针、结构体这些难点,总想给学生一份清晰易懂的复习报告,但自己动手整理又太花时间。或者,…...
短剧小程序源码:打造你的专属短剧平台
温馨提示:文末有资源合作获取方式~一、市场前景:千亿蓝海,风口正当时“昨晚又为一部短剧熬夜了!”这已成为当代年轻人的日常。3分钟一集,连续反转,极致爽点——短剧正以惊人的速度占领我们的碎片…...
基于Altera Cyclone4 FPGA-EP4CE15F17C8核心板的硬件设计实战(原理图+PCB+AD09工程)
1. 从零开始搭建FPGA核心板硬件系统 第一次接触FPGA核心板设计时,我被密密麻麻的引脚和复杂的电源系统搞得头晕眼花。直到用AD09完整走完EP4CE15F17C8核心板的设计流程,才发现硬件开发就像搭积木——只要掌握模块化思维,菜鸟也能做出专业级设…...
