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

简介: 过滤器链模式PK匿名方法实现,哪个更优雅?

 过滤器链模式

类结构图

image.gif编辑

过滤器链

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;
    }
}

image.gif

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

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());
    }
}

image.gif

接口的各种实现

public class LabItemByAgeFilter implements LabItemFilter{
    @Override
    public 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);
    }
}

image.gif

public class LabItemByCodeAgeFilter implements LabItemFilter{
    @Override
    public 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);
    }
}

image.gif

调用

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;

image.gif

匿名方法实现

image.gif编辑

相关文章
|
1月前
过滤器链加载原理
过滤器链加载原理
32 0
过滤器链加载原理
|
7月前
|
iOS开发
Object c事件链传递
Object c事件链传递
70 1
|
XML Java 应用服务中间件
Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例
Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例
196 0
|
7月前
|
Java 数据安全/隐私保护
Filter概述、执行流程、拦截路径配置及过滤器链
Filter概述、执行流程、拦截路径配置及过滤器链
96 0
|
7月前
|
Java 索引
正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图
正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图
88 0
|
JavaScript
过滤器(filter)的基本使用 + 时间戳转化为相对日期过滤器代码封装
过滤器(filter)的基本使用 + 时间戳转化为相对日期过滤器代码封装
84 0
过滤器简介--操作步骤--过滤器生命周期--过滤器匹配规则-- 过滤器链
过滤器简介--操作步骤--过滤器生命周期--过滤器匹配规则-- 过滤器链
71 0
Filter过滤器概念及生命周期
Filter过滤器概念及生命周期
164 0
|
编译器 C++
C++中构造函数调用规则
C++中构造函数调用规则
115 0
|
数据可视化 JavaScript 开发者
过滤器-定义格式化时间的全局过滤器|学习笔记
快速学习过滤器-定义格式化时间的全局过滤器
112 0
过滤器-定义格式化时间的全局过滤器|学习笔记