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设计模式实现一个责任链设计模式,从数据结构可以理解为单向链表的主要内容,如果未能解决你的问题,请参考以下文章