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

目录
打赏
0
0
0
0
1
分享
相关文章
|
4月前
多列组合作为判断依据的具体方法是什么?
通过以上方法,可以根据具体的业务需求和数据特点,灵活地选择以多列组合作为判断数据重复值的依据,从而更准确地处理和分析数据。
109 62
|
4月前
过滤器链加载原理
过滤器链加载原理
48 0
过滤器链加载原理
|
7月前
|
SQL
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
|
9月前
|
使用Lambda表达式实现函数映射和过滤
使用Lambda表达式实现函数映射和过滤
53 1
|
9月前
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
59 0
|
10月前
动态范围匹配逻辑实现
动态范围匹配逻辑实现
57 0
Filter概述、执行流程、拦截路径配置及过滤器链
Filter概述、执行流程、拦截路径配置及过滤器链
111 0
A和B接口同时修改table字段,无法确认调用顺序
在互联网应用开发中,经常会碰到多个接口同时需要修改数据库表字段的情况。然而,由于无法确认接口调用的顺序,可能会导致数据冲突和一致性问题。本文将介绍一种解决这一问题的方法,通过合理的设计和技术手段,确保同时修改table字段的操作能够顺利进行,数据一致性得到保障。
179 0
A和B接口同时修改table字段,无法确认调用顺序
Filter过滤器概念及生命周期
Filter过滤器概念及生命周期
195 0
C++中构造函数调用规则
C++中构造函数调用规则
127 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等