设计模式-过滤器模式
时间:2022-07-25
本文章向大家介绍设计模式-过滤器模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
今年的高考推迟了,每年的高考完后有喜有悲,当然每个人考得的分数不同,所以结果就不用,而一般高校都是有严格的分数界限的,比如211和985、一本、二本、三本、还有普通专科...
过滤器模式是什么?
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
模式可以干嘛?
其实现模式也就是用来做过滤和筛选用的,比如你考700分那肯定是一本或重点大学,当然你也可以选择读不读或选个sb的普通专科;反过来高校也是一样的,你投过来的志愿,正常情况下如果低于分数线直接不录取。
优点:
简单、方便、解耦;
缺点:
目前没有发现...
过滤器模式类图
实现代码
/**
* @Auther: csh
* @Date: 2020/5/25 14:10
* @Description:学生
*/
public class Student implements Serializable {
/** 人名*/
private String realName;
/** 分数*/
private int grade;
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public Student(String realName, int grade) {
this.realName = realName;
this.grade = grade;
}
@Override
public String toString() {
return "Student{" +
"realName='" + realName + ''' +
", grade=" + grade +
'}';
}
}
/**
* @Auther: csh
* @Date: 2020/5/25 14:16
* @Description:分数拦截器
*/
public interface IGradeFilter {
/** 分数拦截器*/
List<Student> conditionGradeFilter(List<Student> studentList);
}
/**
* @Auther: csh
* @Date: 2020/5/25 14:26
* @Description:分数枚举
*/
public enum GradeEnum {
ONE_COLLEGE(700,"1本"),
TWO_COLLEGE(600,"2本"),
THREE_COLLEGE(400,"3本"),
COMMON_COLLEGE(200,"普通专科")
;
private int grade;
private String name;
GradeEnum(int grade, String name) {
this.grade = grade;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
/**
* @Auther: csh
* @Date: 2020/5/25 14:30
* @Description:最好的大学如 清华、北大等
*/
public class BestUniversityFilter implements IGradeFilter{
@Override
public List<Student> conditionGradeFilter(List <Student> studentList) {
List<Student> list = new ArrayList <Student>();
for (Student student : studentList) {
if(student.getGrade()>=GradeEnum.ONE_COLLEGE.getGrade()){
list.add(student);
}
}
return list;
}
}
/**
* @Auther: csh
* @Date: 2020/5/25 14:30
* @Description:二本大学
*/
public class SecondUniversityFilter implements IGradeFilter{
@Override
public List<Student> conditionGradeFilter(List <Student> studentList) {
List<Student> list = new ArrayList <Student>();
for (Student student : studentList) {
if(student.getGrade()>=GradeEnum.TWO_COLLEGE.getGrade() && student.getGrade()<GradeEnum.ONE_COLLEGE.getGrade()){
list.add(student);
}
}
return list;
}
}
/**
* @Auther: csh
* @Date: 2020/5/25 14:30
* @Description:三本大学
*/
public class ThreeUniversityFilter implements IGradeFilter{
@Override
public List<Student> conditionGradeFilter(List <Student> studentList) {
List<Student> list = new ArrayList <Student>();
for (Student student : studentList) {
if(student.getGrade()>=GradeEnum.THREE_COLLEGE.getGrade() && student.getGrade()<GradeEnum.TWO_COLLEGE.getGrade()){
list.add(student);
}
}
return list;
}
}
/**
* @Auther: csh
* @Date: 2020/5/25 14:30
* @Description:普通专科
*/
public class CommonUniversityFilter implements IGradeFilter{
@Override
public List<Student> conditionGradeFilter(List <Student> studentList) {
List<Student> list = new ArrayList <Student>();
for (Student student : studentList) {
if(student.getGrade()>=GradeEnum.COMMON_COLLEGE.getGrade() && student.getGrade()<GradeEnum.THREE_COLLEGE.getGrade()){
list.add(student);
}
}
return list;
}
}
/**
* @Auther: csh
* @Date: 2020/5/25 14:34
* @Description:演示
*/
public class Client {
public static void main(String[] args) {
List<Student> students = new ArrayList <Student>();
for(int i =0;i<20;i++){
students.add(new Student(i+"学生",getRandom(200,750)));
}
for (Student student : students) {
System.out.println(student);
}
System.out.println(students.size()+"个学生!");
System.out.println("----------------------------------------");
BestUniversityFilter best = new BestUniversityFilter();
List <Student> bestList = best.conditionGradeFilter(students);
for (Student student : bestList) {
System.out.println(student);
}
System.out.println(bestList.size()+"个"+GradeEnum.ONE_COLLEGE.getName());
System.out.println("-------------------------------------------");
SecondUniversityFilter second = new SecondUniversityFilter();
List <Student> secondList = second.conditionGradeFilter(students);
for (Student student : secondList) {
System.out.println(student);
}
System.out.println(secondList.size()+"个"+GradeEnum.TWO_COLLEGE.getName());
System.out.println("-------------------------------------------");
ThreeUniversityFilter threeFilter = new ThreeUniversityFilter();
List <Student> threeeList = threeFilter.conditionGradeFilter(students);
for (Student student : threeeList) {
System.out.println(student);
}
System.out.println(threeeList.size()+"个"+GradeEnum.THREE_COLLEGE.getName());
System.out.println("-------------------------------------------");
ThreeUniversityFilter commonFilter = new ThreeUniversityFilter();
List <Student> commonList = commonFilter.conditionGradeFilter(students);
for (Student student : commonList) {
System.out.println(student);
}
System.out.println(threeeList.size()+"个"+GradeEnum.COMMON_COLLEGE.getName());
}
//随机数
public static int getRandom(int start,int end) {
int num=(int) (Math.random()*(end-start+1)+start);
return num;
}
}
最后
该模式非常简单,也很好实现,并且很普遍,在各大框架中都有影子,比如spring mvc中的Filter,还有请求转发中的dispatcher,反正很常用,建议读者在日常开发过程中可以加以实践。
- Python进阶学习之阅读代码
- 代码安全审计:当file_exists遇上eval
- Python 异常处理完整指南
- 有趣的安全实验:利用多线程资源竞争技术上传shell
- NotSerializableException解决方法NotSerializableException
- 谁蹭了我的WiFi?浅谈家用无线路由器攻防
- 当输入流和输出流同时作用一个文件
- 揭秘:充电宝是如何盗取你的个人隐私的?
- 微软:暴力破解面前,增强密码复杂性基本没用
- 创建被图像填充的组件解释几处做法解释几点
- Android原生嵌入React Native
- React Native控件之Listview
- React Native控件只TextInput
- Qzone React Native改造
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决
- Swift 数组dropFirst方法
- Swift 类方法和实例方法
- 我从未见过的牛逼解说方式!Redis五种数据结构,看一遍就懂了
- Swift 动态创建ViewController
- Office 文档解析 文档格式和协议
- 查看centos 7里敏感信息的常用命令(未完)
- C# dotnet 使用 FileStream 随机文件读写
- datables之加载数据时显示进度条
- 这几种常见的“分布式锁”写法,搞懂再也不怕面试官,安排
- C# 8.0 文件长度 Bytes 字节转 KB 等单位字符串
- LeetCode---两数之和
- 通过 cmd 批处理文件将 16 进制转 10 进制数字
- HTML5-JS操作页面滚动条(禁止、隐藏、显示、不显示)
- 追根溯源MySQL,“你的表情”插入对了吗?