# 责任链模式

115 阅读1分钟

责任链模式

1、功能代码

/**
 * 项目名称:spring-demo
 * 类 名 称:GzwFilter
 * 类 描 述:责任链模式-功能接口
 * 创建时间:2022/3/28 10:21 下午
 *
 * @author gzw
 */
@SuppressWarnings("all")
public interface GzwFilter<U> {


     U doFilter(U lastFilterStage);
}

2、 责任链模式-抽象处理者



/**
 * 项目名称:spring-demo
 * 类 名 称:GzwFilterChain
 * 类 描 述:责任链模式-抽象处理者
 * 创建时间:2022/3/28 10:27 下午
 *
 * @author gzw
 */
public abstract class GzwFilterChain<U>  {


    private List<GzwFilter<U>> gzwFilterList;


    protected GzwFilterChain(List<GzwFilter<U>> gzwFilters) {
        if (null != gzwFilters && !gzwFilters.isEmpty()) {
            this.gzwFilterList = gzwFilters;
        }
    }
    /**
     * 处理方法
     */
    public U doFilter(U initStage) {
        if (null == gzwFilterList) {
            return null;
        }

        U stage = initStage;
        for (GzwFilter<U> filter : gzwFilterList) {
            stage = filter.doFilter(stage);
            // filter返回null, 则中断职责链的执行
            if (null == stage) {
                return null;
            }
        }
        return stage;
    }
}

3、处理结果

/**
 * @author gzw
 * @since 2020/9/25
 */
@Data
@Accessors(chain = true)
@NoArgsConstructor
public class DemoGzwFilterStage {
    List<Map<String, Object>> stageHandlerResult = Collections.emptyList();
}

4、执行链1

/**
 *
 * @author gzw
 * @since 2020/9/25
 */
@Component
public class DemoOneFilter implements GzwFilter<DemoGzwFilterStage> {



    @Override
    public DemoGzwFilterStage doFilter(DemoGzwFilterStage lastFilterStage) {
        List<Map<String, Object>> recallDocs= Collections.emptyList();
        /**
         * 1、实际该步骤需要处理的逻辑。并返回
         */
        return lastFilterStage.setStageHandlerResult(recallDocs);
    }
}

5、执行链2

/**
 *
 * @author gzw
 * @since 2020/9/25
 */
@Component
public class DemoTwoFilter implements GzwFilter<DemoGzwFilterStage> {



    @Override
    public DemoGzwFilterStage doFilter(DemoGzwFilterStage lastFilterStage) {
        List<Map<String, Object>> recallDocs= Collections.emptyList();
        /**
         * 2、实际该步骤需要处理的逻辑。并返回
         */
        return lastFilterStage.setStageHandlerResult(recallDocs);
    }
}

6、处理执行

根据一定的顺序去执行
@Component
public class DemoGzwFilterChain extends GzwFilterChain<DemoGzwFilterStage> {

    @Autowired
    public DemoGzwFilterChain(
            DemoOneFilter oneFilter,
            DemoTwoFilter twoFilter) {
        super(
                Arrays.asList(
                        oneFilter,
                        twoFilter));
    }
}