美文网首页
简单理解责任链模式

简单理解责任链模式

作者: lclandld | 来源:发表于2020-03-06 14:23 被阅读0次

1、理解责任链模式

在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。
例如

  • 公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难度。
  • 找领导出差报销
  • 生活中的“击鼓传花”游戏。

2、责任链模式的结构图

  • 抽象处理者(Handler):定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  • 具体处理者(ConcreateHandlerA、ConcreateHandlerB):实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  • 客户类(Client):创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。


    image.png

3、责任链模式简单代码的具体实现

  • 定义一个抽象处理类Handler
/**
 * @author lichunlan
 * @description 责任者模式的抽象处理类
 * @since 2020-03-04
 */

public abstract class Handler {
    /**
     * 后继链接
     */
    protected Handler successor;

    public Handler getSuccessor() {
        return successor;
    }
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    /**
     * 具体的抽象处理方法
     */
    protected abstract  void  selfHandlerProcess();
    /**
     * 链头的具体处理者
    */
    public void executed(){
        selfHandlerProcess();
        if(null != successor){
            successor.executed();
        }
    }
}

  • 具体处理者
    注意我是把这几个类的定义放到public static void main(String[] args) {}同一个类中的
   static class ConcreateHandlerA extends Handler{
        @Override
        protected void selfHandlerProcess() {
            System.out.println("处理A");
        }
    }
    static class ConcreateHandlerB extends Handler{
        @Override
        protected void selfHandlerProcess() {
            System.out.println("处理B");
        }
    }
    static  class ConcreateHandlerC extends Handler{
        @Override
        protected void selfHandlerProcess() {
            System.out.println("处理C");
        }
    }
  • 客户类(Client)
public static void main(String[] args) {
        Handler handlerA = new ConcreateHandlerA();
        Handler handlerB = new ConcreateHandlerB();
        Handler handlerC = new ConcreateHandlerC();
        handlerA.setSuccessor(handlerB);
        handlerB.setSuccessor(handlerC);
        handlerA.executed();
    }
  • 运行的结果


    image.png

4、责任链模式3中代码的优化

从图中可以看到,假设我们有20个具体处理者,那我们得重复写20遍这个代码,很明显需要优化
我们把所有的具体处理者放到一个List中,


image.png
  • 抽象处理者
/**
 * @author lichunlan
 * @description 抽象处理者
 * @since 2020-03-05
 */
public abstract class ChainHandler {
    /**
     * 具体的抽象处理方法
     */
    protected abstract void selfHandlerProcess();
    /**
     * 链头的具体处理者
     */
    public void executed(Chain chain){
        selfHandlerProcess();
        chain.progress();
    }
}
  • 链接类,把所有的具体处理者放到一个List中

/**
 * @author lichunlan
 * @description 把具体处理者封装成一个List
 * @since 2020-03-05
 */
public class Chain {
    List<ChainHandler> handlerList;
    private int index = 0;
    public Chain(List<ChainHandler> handlerList) {
        this.handlerList = handlerList;
    }
    /**
     * 把所有的具体处理者链接起来
     */
    public void progress(){
        if(index >= handlerList.size()){
            return;
        }
        handlerList.get(index++).executed(this);
    }

}

  • 具体处理者
    注意我是把这几个类的定义放到public static void main(String[] args) {}同一个类中的
 static class ConcreateHandlerA extends ChainHandler {
        @Override
        protected void selfHandlerProcess() {
            System.out.println("处理A");
        }
    }
    static class ConcreateHandlerB extends ChainHandler{
        @Override
        protected void selfHandlerProcess() {
            System.out.println("处理B");
        }
    }
    static  class ConcreateHandlerC extends ChainHandler{
        @Override
        protected void selfHandlerProcess() {
            System.out.println("处理C");
        }
    }
  • 客户类(Client)
 public static void main(String[] args) {
       List<ChainHandler> chainHandlerList = Arrays.asList(new ConcreateHandlerA(),new ConcreateHandlerB(),new ConcreateHandlerC());
       Chain chain = new Chain(chainHandlerList);
       chain.progress();
   }
  • 运行结果


    image.png

5、责任链模式的使用场景

有多个对象可以处理一个请求,哪个对象处理该请求由运行时刻自动确定。
可动态指定一组对象处理请求,或添加新的处理者。
在不明确指定请求处理者的情况下,向多个处理者中的一个提交请求。

总结:

对于设计模式来说,简单的demo应用,看懂了感觉也没多大实用性,因为自己还是不知道项目中具体该如何应用,所有我在看设计模式的时候,尽量去找哪些源码中用到了,然后实际再分析一下,自己画一个UML图,对于自己的理解和实际应用都有很大的提升。我看过一篇文章说OkHttp3、Netty NIO、Spring Aop都用到了责任链模式,于是接下来的另外一篇文章,从OKHttp源码中看责任链模式是关于如何从别人的源码精华中,真正看懂责任链模式。

参考文档

runoob.com
c.biancheng.net

相关文章

网友评论

      本文标题:简单理解责任链模式

      本文链接:https://www.haomeiwen.com/subject/npzqlhtx.html