过滤器链模式PK匿名方法实现,哪个更优雅?
过滤器链模式
类结构图
过滤器链
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匿名方法实现,哪个更优雅?相关推荐
- Android设计模式之——责任链模式
一.介绍 责任链模式(Iterator Pattern),是行为型设计模式之一.什么是"链"?我们将多个节点首尾相连所构成的模型称为链,比如生活中常见的锁链,就是由一个个圆角长方形 ...
- 从 Forces 开始分析责任链模式:「写一个 Discord 对话机器人」
目录 前言 你收到了一份需求 面向对象分析 (OOA) 初版程式实作 察觉 Forces 套用责任链模式 (OOD) 封装变动之处 (Encapsulate what varies) 萃取共同行为 ( ...
- 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)
一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...
- Java培训总结:过滤器链的实现方法、配置和案例分析
今天小千给大家分享的是Java培训总结:过滤器链的实现方法.配置和案例分析. 过滤器能够对网站中的各种内容进行过滤(页面.Servlet.图片.文件),可以在网站内容请求和响应时进行一些操作,完成一些 ...
- 源码解析——FilterChain是职责链(过滤器)模式的典型应用
源码解析 在javaWeb应用开发中,FilterChain是职责链(过滤器)模式的典型应用,以下是Filter的模拟实现分析: Request.java package com.itheima.pa ...
- java责任链模式_java中责任链模式详解和使用方法
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为 ...
- java工作流 责任链模式 审核审批流程 方法二
因为最近在搞一些工作流的事情,而传统的Activity等工作流又太重,不太适合我们的系统,所以在网上找到了Apache Commons Chain这个实现比较轻的Command模式与责任链模式结合的工 ...
- 一起学设计模式 - 责任链模式
责任链模式(ChainOfResponsibilityPattern)属于 行为型模式的一种,将请求沿着一条链传递,直到该链上的某个对象处理它为止. 概述 定义如下:一个请求有多个对象来处理,这些对象 ...
- 漫画设计模式:什么是 “职责链模式” ?
作者 | 小灰 来源 | 程序员小灰(ID:chengxuyuanxiaohui) ----- 第二天 ----- ------------ 在一家公司里,有三个程序员,他们的名字分别是小A.小B ...
最新文章
- agc018B Sports Festival
- 正式突破两千粉丝!开心!
- 解决securecrt rz 上传rar,gif文件不正确问题【转】
- Asp.Net--回调技术
- php基础案例例子,PHP基础案例教程
- 2020年系统集成项目管理工程师课教程
- 用友凭证打印没有辅助项
- vue、js onSelect事件 获取选中的值
- java程序员面试简历注意事项
- r720服务器独立显卡显示,dell服务器进入bios独立显卡(dellr720安装独立显卡)
- css的背景颜色有哪些,css背景颜色、背景图片,以及列表的多种样式
- 读书笔记---Naive Bayes
- .NET 对象序列化学习笔记(—)
- Eclipse中设置作者日期等Java注释模板
- linux运维工程师 倒班,运维人员值班制度
- 如何轻松把mysql数据表对齐?!正解在这儿
- C++ RTMP直播流播放器
- oj3014文件格式变换
- 案例分析企业微信带来的功能效果?
- 思科无线AP配置之二(通过超级终端配置ap的ip地址篇)
热门文章
- Oracle Real Application Testing diagram
- Thread.join的作用和原理
- 一个关于将满足给定条件的数据按顺序写到另一文件中的C语言函数。
- html背景动起来,CSS+HTML 循环滚动背景效果
- 2022春节行为经济学
- 如何快速排查生产问题
- js赋值与逻辑运算的疑问
- centos 6 php环境,centos6.6 下 安装 php7 + nginx环境的方法
- matplotlib中文乱码问题_MacOS解决Matplotlib的中文乱码问题
- 什么是嵌入式工程师,发展前景如何