Java设计模式实现一个责任链设计模式,从数据结构可以理解为单向链表

Posted Acmen-zym

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式实现一个责任链设计模式,从数据结构可以理解为单向链表相关的知识,希望对你有一定的参考价值。

这个责任链是我用在项目中对标题的一些过滤处理,例如中英文数量、违禁词、特殊字符等

定义一个抽象类,具体的过滤需要实现这个抽象类中的doFilter抽象方法

public abstract class TitleFilterChain {

    protected static Logger logger = LoggerFactory.getLogger(com.rocket.copy.chain.TitleFilterChain.class);

    protected TitleFilterChain node;//节点,也就是在创建多个任务链时用于存储任务节点对象

    public void setNode(TitleFilterChain node) {
        this.node = node;
    }

    /**
     * false表示没有通过过滤, true表示通过过滤
     *
     * @param model
     * @param templateBo
     * @return
     */
    public abstract boolean doFilter(GoodsBaseModel model, CopyItemTemplate templateBo);

    /**
     * 每次子类执行完doFilter方法后会调用此方法
     *
     * @param filterResult 为false则断掉任务链
     * @param model        需要处理的数据模型
     * @param template     处理的规则模型
     * @return true则表示可以继续执行, false则表示没有通过过滤
     */
    protected boolean returnResult(boolean filterResult, GoodsBaseModel model, CopyItemTemplate template) {
        return filterResult ? (this.node == null ? true : node.doFilter(model, template)) : filterResult;
    }
}

写一个责任链创建的简单工厂类
此方法可以生成链表的核心就是第二个私有方法,方法编写解释:
这里从1开始的原因是需要返回的是一个链表,例如将2号子实现类设置到1号子实现类的节点中,假设当前i=1的i-1得到数组的0号下标的对象,然后0号调用setNode将1号设置为自己的节点,以此类推成为一个单向链表的数据结构,最终只需要将0号下标的实例返回出去即可得到一个责任链

public class ChainFactory {


    public static TitleFilterChain getTitleFilterChain(Class<? extends TitleFilterChain>... classes) {
        TitleFilterChain[] chain = new TitleFilterChain[classes.length];
        for (int i = 0; i < classes.length; i++) {
            try {
                chain[i] = classes[i].newInstance();//创建实例
            } catch (Exception e) {
                //避免链条中断,设个默认通过过滤的节点
                chain[i] = new TitleFilterChain() {
                    @Override
                    public boolean doFilter(GoodsBaseModel model, CopyItemTemplate templateBo) {
                        return true;
                    }
                };

            }
        }
        return getTitleFilterChain(chain);
    }

    private static TitleFilterChain getTitleFilterChain(TitleFilterChain[] chain) {
        for (int i = 1; i < chain.length; i++) chain[i - 1].setNode(chain[i]);
        return chain[0];
    }

}

具体使用如下
具体实现类中的业务代码就不进行展示了,这些类都继承了TitleFilterChain抽象类,实现了doFilter方法

 TitleFilterChain filterChain = ChainFactory.getTitleFilterChain(
                TitleCharNumFilter.class, TitleEnglishAlphabetNumFilter.class,
                TitleSpecialSymbolNumFilter.class, TitleKeyWordFilter.class);
 filterChain.doFilter(baseModel, copyParamModel.getTemplate());

创建后的filterChain 如下图
在这里插入图片描述

以上是关于Java设计模式实现一个责任链设计模式,从数据结构可以理解为单向链表的主要内容,如果未能解决你的问题,请参考以下文章

Java 设计模式之责任链学习与掌握

Java 设计模式之责任链学习与掌握

java 责任链模式的三种实现

两种语言实现设计模式(C++和Java)(十四:责任链模式)

云原生Java设计模式8,校验审批流程改善神器,责任链模式

23种设计模式(二十)——责任链模式数据结构