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 如下图
在这里插入图片描述

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Acmen-zym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值