过滤器链模式

类结构图

过滤器链

public class LabItemFilterChain {private List<LabItemFilter> labItemFilters;int pos = 0;public LabItemFilterChain() {this.labItemFilters = new LinkedList<>();}public void addFilter(LabItemFilter labItemFilter) {labItemFilters.add(labItemFilter);}public LabItemRange doFilter(Report request,List<LabItemRange> response) {LabItemRange range = null;if (request==null|| CollectionUtils.isEmpty(response)) {return null;}if (pos<labItemFilters.size()) {range = labItemFilters.get(pos++).doFilter(request, response, this);if (range!=null) {return range;}}return null;}
}

过滤器接口及默认比较方法

public interface LabItemFilter {LabItemRange doFilter(Report report, List<LabItemRange> itemRanges,LabItemFilterChain filterChain);default boolean compareCode(LabItemRange itemRange,Report report){if (itemRange.getSampleCode()==null||report.getSampleCode()==null) {return false;}return Objects.equals(itemRange.getSampleCode(),report.getSampleCode());}default boolean compareAge(LabItemRange itemRange,Report report){Integer age = report.getAge();Integer ageUnit = report.getAgeUnit();Integer lowAge = itemRange.getLowAge();Integer highAge = itemRange.getHighAge();Integer lowAgeUnit = itemRange.getLowAgeUnit();Integer highAgeUnit = itemRange.getHighAgeUnit();if (age==null||ageUnit==null||lowAge==null||highAge==null||lowAgeUnit==null||highAgeUnit==null) {return false;}long ageSecond = age * AlisDateUtils.getSecondsByAgeUnit(ageUnit);long lowAgeSecond = lowAge * AlisDateUtils.getSecondsByAgeUnit(lowAgeUnit);long hignAgeSecond = highAge * AlisDateUtils.getSecondsByAgeUnit(highAgeUnit);return ageSecond>=lowAgeSecond&&ageSecond<=hignAgeSecond;}default boolean compareSex(LabItemRange itemRange,Report report){if (itemRange.getSex()==null||report.getSex()==null) {return false;}return Objects.equals(itemRange.getSex(),report.getSex());}
}

接口的各种实现

public class LabItemByAgeFilter implements LabItemFilter{@Overridepublic LabItemRange doFilter(Report report, List<LabItemRange> itemRanges, LabItemFilterChain filterChain) {for (LabItemRange itemRange : itemRanges) {if (Objects.isNull(itemRange.getSampleCode())&&Objects.isNull(itemRange.getSex())&&compareAge(itemRange,report)) {return itemRange;}}return filterChain.doFilter(report, itemRanges);}
}
public class LabItemByCodeAgeFilter implements LabItemFilter{@Overridepublic LabItemRange doFilter(Report report, List<LabItemRange> itemRanges, LabItemFilterChain filterChain) {for (LabItemRange itemRange : itemRanges) {if (Objects.isNull(itemRange.getSex())&&compareCode(itemRange,report)&&compareAge(itemRange,report)) {return itemRange;}}return filterChain.doFilter(report, itemRanges);}
}

调用

        LabItemFilterChain chain = new LabItemFilterChain();chain.addFilter(new LabItemByCodeAgeSexFilter());chain.addFilter(new LabItemByCodeAgeFilter());chain.addFilter(new LabItemByCodeSexFilter());chain.addFilter(new LabItemByCodeFilter());chain.addFilter(new LabItemByAgeSexFilter());chain.addFilter(new LabItemByAgeFilter());chain.addFilter(new LabItemBySexFilter());chain.addFilter(new LabItemDefaultFilter());LabItemRange labItemRange = chain.doFilter(report, labItemRangeList);return labItemRange;

匿名方法实现

过滤器链模式PK匿名方法实现,哪个更优雅?相关推荐

  1. Android设计模式之——责任链模式

    一.介绍 责任链模式(Iterator Pattern),是行为型设计模式之一.什么是"链"?我们将多个节点首尾相连所构成的模型称为链,比如生活中常见的锁链,就是由一个个圆角长方形 ...

  2. 从 Forces 开始分析责任链模式:「写一个 Discord 对话机器人」

    目录 前言 你收到了一份需求 面向对象分析 (OOA) 初版程式实作 察觉 Forces 套用责任链模式 (OOD) 封装变动之处 (Encapsulate what varies) 萃取共同行为 ( ...

  3. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

  4. Java培训总结:过滤器链的实现方法、配置和案例分析

    今天小千给大家分享的是Java培训总结:过滤器链的实现方法.配置和案例分析. 过滤器能够对网站中的各种内容进行过滤(页面.Servlet.图片.文件),可以在网站内容请求和响应时进行一些操作,完成一些 ...

  5. 源码解析——FilterChain是职责链(过滤器)模式的典型应用

    源码解析 在javaWeb应用开发中,FilterChain是职责链(过滤器)模式的典型应用,以下是Filter的模拟实现分析: Request.java package com.itheima.pa ...

  6. java责任链模式_java中责任链模式详解和使用方法

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为 ...

  7. java工作流 责任链模式 审核审批流程 方法二

    因为最近在搞一些工作流的事情,而传统的Activity等工作流又太重,不太适合我们的系统,所以在网上找到了Apache Commons Chain这个实现比较轻的Command模式与责任链模式结合的工 ...

  8. 一起学设计模式 - 责任链模式

    责任链模式(ChainOfResponsibilityPattern)属于 行为型模式的一种,将请求沿着一条链传递,直到该链上的某个对象处理它为止. 概述 定义如下:一个请求有多个对象来处理,这些对象 ...

  9. 漫画设计模式:什么是 “职责链模式” ?

    作者 | 小灰 来源 | 程序员小灰(ID:chengxuyuanxiaohui) -----  第二天  ----- ------------ 在一家公司里,有三个程序员,他们的名字分别是小A.小B ...

最新文章

  1. agc018B Sports Festival
  2. 正式突破两千粉丝!开心!
  3. 解决securecrt rz 上传rar,gif文件不正确问题【转】
  4. Asp.Net--回调技术
  5. php基础案例例子,PHP基础案例教程
  6. 2020年系统集成项目管理工程师课教程
  7. 用友凭证打印没有辅助项
  8. vue、js onSelect事件 获取选中的值
  9. java程序员面试简历注意事项
  10. r720服务器独立显卡显示,dell服务器进入bios独立显卡(dellr720安装独立显卡)
  11. css的背景颜色有哪些,css背景颜色、背景图片,以及列表的多种样式
  12. 读书笔记---Naive Bayes
  13. .NET 对象序列化学习笔记(—)
  14. Eclipse中设置作者日期等Java注释模板
  15. linux运维工程师 倒班,运维人员值班制度
  16. 如何轻松把mysql数据表对齐?!正解在这儿
  17. C++ RTMP直播流播放器
  18. oj3014文件格式变换
  19. 案例分析企业微信带来的功能效果?
  20. 思科无线AP配置之二(通过超级终端配置ap的ip地址篇)

热门文章

  1. Oracle Real Application Testing diagram
  2. Thread.join的作用和原理
  3. 一个关于将满足给定条件的数据按顺序写到另一文件中的C语言函数。
  4. html背景动起来,CSS+HTML 循环滚动背景效果
  5. 2022春节行为经济学
  6. 如何快速排查生产问题
  7. js赋值与逻辑运算的疑问
  8. centos 6 php环境,centos6.6 下 安装 php7 + nginx环境的方法
  9. matplotlib中文乱码问题_MacOS解决Matplotlib的中文乱码问题
  10. 什么是嵌入式工程师,发展前景如何