过滤器链模式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月前
过滤器链加载原理
过滤器链加载原理
46 0
过滤器链加载原理
|
8月前
|
Java API
使用Lambda表达式实现函数映射和过滤
使用Lambda表达式实现函数映射和过滤
52 1
|
8月前
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
57 0
|
9月前
|
Java 数据安全/隐私保护
Filter概述、执行流程、拦截路径配置及过滤器链
Filter概述、执行流程、拦截路径配置及过滤器链
109 0
Filter过滤器概念及生命周期
Filter过滤器概念及生命周期
174 0
|
编译器 C++
C++中构造函数调用规则
C++中构造函数调用规则
123 0
|
Java 关系型数据库 MySQL
Filter生命周期的简单实例
Filter生命周期的简单实例
168 0
|
Android开发
【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )
【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )
232 0
【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )
|
Java 索引
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(三)
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(三)
124 0
【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )(三)