前言

许多框架如mybatis,servlet的filter,dubbo,平安框架诸如Spring security、apache shiro都市用到设计模式中的责任链模式,以是学习责任链模式成为辅助你学习以上这些框架的一个好的手段之一。今天我们就来领会一下责任链模式。

界说

若是有多个工具(Handler)都有机遇处置数据源(RequestSource,这里不是单纯的数据库数据源,可以是一个请求,总之是泉源),责任链可以使数据的发送者和接收者解耦,数据沿着责任链通报,直到有一个工具处置了它为止。形成了一条流水线的链条,以是称之为责任链,然则不仅仅局限于链条,还可以成树形或者环形,这取决于你的营业设计。

场景

插件设计、拦截器、过滤器等一些针对切入点的特定链式处置。都可以使用责任链模式。

实现方式

实现方式常用有两种,它们的差别主要是界说处置链的顺序和结构的差别,接下来我们来看看这两种方式。

方式一

通过处置器聚集来界说处置顺序。利益在于可以集中治理处置器,指责单一。异常容易明白,容易实现。瑕玷是若是新增处置器(Handler)势必影响已有的处置器,只能顺序执行。处置流程是这样的:

接下来用代码来实现一下此模式:

HandlerChain 卖力维护挪用链条的顺序,这里默认实现用List来治理Handler

,

联博开奖

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

,
public interface HandlerChain {

    /**
     * 挪用handler 处置 source.
     *
     * @param requestSource the request source
     */

    void doChain(RequestSource requestSource);
}

// 实现

public class DefaultHandlerChain implements HandlerChain {

    // 当前handler指针的位置
    private int pos = 0;
    private List<Handler> handlers = new ArrayList<>();

    public void addHandler(Handler handler) {
        handlers.add(handler);
    }

    @Override

    public void doChain(RequestSource requestSource) {
        int size = handlers.size();
        if (pos < size) {
          //注重对pos的处置
            Handler handler = handlers.get(pos++);
            handler.doHandler(requestSource, this);
        }
    }
}

Handler是处置链的节点抽象,是数据源(RequestSource)的详细处置者,它卖力对数据的处置以及决议是否进入下一个Handler。

public interface Handler {

    /**
     * Do handler.
     *
     * @param requestSource 数据源
     * @param handlerChain 传入当前的Chain举行类似递归式的挪用。
     */

    void doHandler(RequestSource requestSource,HandlerChain handlerChain);

}

// 其中一个实现

public class HeaderHandler implements Handler {
    @Override
    public void doHandler(RequestSource requestSource, HandlerChain handlerChain) {

       // 处置数据
        Integer header = requestSource.getHeader();
        System.out.println("header handler= " + header);
       //继续下一个 你可以凭据条件来决议是否继续举行chain
        handlerChain.doChain(requestSource);
    }
}

方式二

该方式行使链表的指针特征。这里行使了链表的一部分特点,通过在当前的Handler指定下一个Handler来作为指针,相比较上面而言,Handler更自治,在节点的处置上加倍天真。

Handler卖力指针以及逻辑处置:

public interface Handler {

    /**

     * 指针指向下一个处置节点.
     *
     * @return the next
     */

    Handler getNext();

    /**
     * 处置详细逻辑.
     *
     * @param requestSource the request source
    */

    void doHandler(RequestSource requestSource);

}

// 实现

public class HeaderHandler implements Handler {

    private Handler next;

    public HeaderHandler(Handler next) {
        this.next = next;
    }

    @Override
    public Handler getNext() {
        return next;
    }

    @Override
    public void doHandler(RequestSource requestSource) {

        Integer header = requestSource.getHeader();
        System.out.println("header = " + header);
        if (next != null) {
            next.doHandler(requestSource);
        }
    }
}

总结

责任链模式在种种常见框架中异经常见。以是建议列位在对此设计模式举行认真学习。

demo地址:https://gitee.com/felord/chain-pattern.git