🔥🔥筛选老师-过滤器模式:解耦逻辑,实现灵活的数据过滤

前言

在之前的文章中已经向大家介绍了策略模式的使用,在本期中我向大家介绍另外一种设计模式------过滤器模式。 大家看名字就应该清楚 过滤器模式就是用来过滤数据的,与策略模式不同,过滤器模式属于结构型模式,这种模式允许开发人员使用不同的 标准来过滤一组对象,通过运算逻辑以解耦的方式将它们连接起来。过滤器模式可结合多个标准来获得单一标准。简单点说就是用不同的规则来过滤数据。 在过滤器模式中。主要有三种角色

  • 抽象过滤器
    抽象过滤器即定义了各个规则下过滤的原则
  • 具体过滤器 具体过滤器则针对每一种情况对其进行过滤
  • 被过滤对象 过滤对象即是过滤的主体内容

上面这张图就表示了这种关系 在接口中定义了一个过滤的方法,具体的实现通过其实现类的规则来进行过滤,过滤的内容就是context

筛选老师-过滤器模式

下面我们来举一个例子,让大家能更清楚的了解过滤器模式的思想,假设我们要向外提供一个方法,为课程找到适合上课的老师。由于每个课的时间不同,科目不同,我们很难在一个方法中实现。首先我们按照上面的方法来实现

java 复制代码
interface TeacherFilter{
 
 TeacherContext filter(TeacherContext context);
}

class TeacherSubjectFilter implent TeacherFilter{

  TeacherContext filter(TeacherContext context){
    // 科目过滤 
  }
}

class TeacherTimeConfiltFilter implent TeacherFilter{

  TeacherContext filter(TeacherContext context){
    // 时间冲突过滤 
  }
}

这样 我们定义了一个抽象的规则和两个具体的实现。 在TeacherContext中可以有这样一些属性

  1. 待筛选的老师集合
  2. 是否满足条件
  3. 筛选所需的其余条件

这样在每个实现中只需要执行过滤,返回数据就可以。 但还要考虑一个问题,就是后续过滤规则越来越多,则会使代码的可读性下降。

java 复制代码
Enum filterRule{
  
  MATH_RULE{
    SubjectFilter();
    TimeFilter();
    
  }
  
  SPORTS_RULE{
    SubjectFilter();
    TimeFilter();
    AgeFilter();
  }
}

我们可以定义一个枚举 每一个大类代表一类筛选规则 ,其中记录了对应的实现,比如如果找一位体育老师,需要科目过滤,时间过滤,年龄过滤,这样,代码的可维护性就会上一个档次

注意点

首先 在定义具体过滤器时应对使用尽可能低的粒度。这样在对具体实现进行改动时,对现有逻辑的影响最小,不然改了一个也影响了其他的,反而是一种麻烦。 其次,要考虑的在使用中由于过滤实现的不断增加,导致使用方很难一次梳理需要哪些规则进行过滤,在对外暴露接口时 应尽可能规范,或将封装好的过滤接口对外暴露。在本身的使用中也应该有一个地方统一管理这些过滤规则,例如在上面的例子在使用的枚举将不同的规则进行了分类。在对某一种大类的规则修改时简单易懂,甚至不需看具体实现 只看使用了哪些过滤的枚举就大概清楚整体的逻辑 最后,还要考虑到整体的实现越来越多,需要的条件也越来越多,最终可能会导致整体接口变得慢,这时需要考虑条件判断,提前返回,提高接口的效率

相关推荐
IT探险家1 分钟前
你的第一个 Java 程序就翻车?HelloWorld 的 8 个隐藏陷阱
java
茶杯梦轩2 分钟前
从零起步学习RabbitMQ || 第二章:RabbitMQ 深入理解概念 Producer、Consumer、Exchange、Queue 与企业实战案例
服务器·后端·消息队列
随风飘的云3 分钟前
SpringBoot 的自动配置原理
java
随逸1773 分钟前
《 吃透RAG:从原理到LangChain实战,彻底解决大模型幻觉问题》
后端
SimonKing8 分钟前
觅得又一款轻量级数据库管理工具:GoNavi
java·后端·程序员
小码哥_常8 分钟前
面试必知!Java线程池深度剖析
后端
Moment39 分钟前
Cursor 的 5 种指令方法比较,你最喜欢哪一种?
前端·后端·github
IT_陈寒43 分钟前
Vite快得离谱?揭秘它比Webpack快10倍的5个核心原理
前端·人工智能·后端
Seven971 小时前
BIO详解:解锁阻塞IO的使用方式
java
摸鱼的春哥1 小时前
Agent教程17:LangChain的持久化和人工干预
前端·javascript·后端