过滤器链模式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编辑

相关文章
|
3月前
|
安全 Java 数据库连接
|
5月前
|
Java API
使用Lambda表达式实现函数映射和过滤
使用Lambda表达式实现函数映射和过滤
31 1
|
XML Java 应用服务中间件
Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例
Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例
153 0
|
6月前
|
Java 数据安全/隐私保护
Filter概述、执行流程、拦截路径配置及过滤器链
Filter概述、执行流程、拦截路径配置及过滤器链
82 0
|
消息中间件 缓存 数据库
A和B接口同时修改table字段,无法确认调用顺序
在互联网应用开发中,经常会碰到多个接口同时需要修改数据库表字段的情况。然而,由于无法确认接口调用的顺序,可能会导致数据冲突和一致性问题。本文将介绍一种解决这一问题的方法,通过合理的设计和技术手段,确保同时修改table字段的操作能够顺利进行,数据一致性得到保障。
144 0
A和B接口同时修改table字段,无法确认调用顺序
过滤器简介--操作步骤--过滤器生命周期--过滤器匹配规则-- 过滤器链
过滤器简介--操作步骤--过滤器生命周期--过滤器匹配规则-- 过滤器链
61 0
Filter过滤器概念及生命周期
Filter过滤器概念及生命周期
146 0
index.js:39 错误:修饰类属性失败。请确保提案类属性已启用并设置为使用松散模式。要在规范模式下将提案类属性与修饰器一起使用,请在阶段 2 中等待下一个主要版本的装饰器。 #79
index.js:39 错误:修饰类属性失败。请确保提案类属性已启用并设置为使用松散模式。要在规范模式下将提案类属性与修饰器一起使用,请在阶段 2 中等待下一个主要版本的装饰器。 #79
80 0
|
Java 应用服务中间件 Spring
自定义Filter后,我的业务代码怎么被执行了多次?
若要求构建的过滤器针对全局路径有效,且无任何特殊需求(主要针对 Servlet 3.0 的一些异步特性),则完全可直接使用 Filter 接口(或继承 Spring 对 Filter 接口的包装类 OncePerRequestFilter),并使用**@Component** 将其包装为 Spring 中的普通 Bean,也可达到预期需求。
159 0
|
JavaScript 开发者
过滤器-定义私有过滤器|学习笔记
快速学习过滤器-定义私有过滤器
114 0
过滤器-定义私有过滤器|学习笔记