责任链模式

什么是责任链模式

责任链模式是一种行为设计模式,请求会被一个责任链按照顺序处理,每个处理器会处理请求并决定要不要将请求传给下个处理器。

什么时候可以使用责任链模式

当需要做一系列平行操作时,可以使用责任链模式。
例如,需要对用户发表的评论和文章过滤,需要过滤政治敏感、色情相关、不文明等词语,这个时候就可以设计多个敏感词过滤器并组成责任链,将文章内容交给责任链进行处理。
还有一个场景,当接受到一个用户的发起交易的请求时,可能会有多种鉴权的步骤需要进行,需要验证这个用户是否属于系统,这个用户是否合法,是否被冻结,可能需要验证用户的ip,这个时候可以设计一个责任链,用来处理用户的请求,当其中一个不满足时,这个请求就不应该再继续下去。

责任链模式代码演示

责任链实现方式有多种,这里演示使用继承实现责任链。 图片演示:


// 定一个抽象类Handler
public abstract class Handler {
   //用来保存下一个Handler的属性,在满足一定条件时将请求交给下个Handler处理
    protected Handler successor = null;

    //用来设置下个Handler
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

   //调用真正的处理请求的方法,当满足一定条件时,调用下个Handler处理请求
    public final void handle() {
        boolean handled = doHandle();
        if(!handled && null != successor) {
            successor.handle();
        }
    }

   //真正的处理请求的方法,每个具体的Handler必须实现的方法
    public abstract boolean doHandle();
}

// 定一个HandlerA,继承Handler类
public class HandlerA extends Handler {

    @Override
    public boolean doHandle() {
        boolean handled = false;

        System.out.println("HandlerA ... ");

        return handled;
    }
}

// 定一个HandlerA,继承Handler类
public class HandlerB extends Handler {

    @Override
    public boolean doHandle() {
        boolean handled = false;

        System.out.println("HandlerB ... ");

        return handled;
    }
}

//定一个HandlerChain类,这个是责任链,保存这链头和链尾
public class HandlerChain {
    //链头 
    private Handler head = null;
    //链尾
    private Handler tail = null;

    //将具体的Handler添加到责任链中
    public void addHandler(Handler handler) {
        //新添加的Handler是链尾,所以它后面没有任何Handler,设置为null
        handler.setSuccessor(null);

        //如果第一次添加Handler,那么head和tail指向同一个handler
        if(null == head) {
            head = handler;
            tail = handler;
            return;
        }

        //给当前的链尾设置handler,将最新的handler接到链尾
        tail.setSuccessor(handler);
        //将链尾指针指向最新的handler
        tail = handler;
    }
    
    //对外提供方法调用责任链中的handler
    public void handle() {
        if(null != head) {
            head.handle();
        }
    }
}

public class Application {
    public static void main(String[] args) {
        HandlerChain chain = new HandlerChain();
        chain.addHandler(new HandlerA());
        chain.addHandler(new HandlerB());
        chain.handle();
    }
}

在HandlerChain的实现中,可以使用链表来保存handler,也可以使用数组来保存handler.

责任链的优缺点

优点

  • 满足开闭原则,添加新的handler方便。
  • 你可以控制请求处理的顺序。
  • 单一职责原则。 你可对发起操作和执行操作的类进行解耦。

缺点

  • 部分请求可能未被处理

灵活使用责任链

上面的责任链代码中,如果请求内容没有满足否个条件,马上终止处理,也可以灵活变通一下,将判断的代码移除,这样每个处理器都可以走一遍,在某些场景下可以使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容