小灰 程序员小灰


—————  第二天  —————




————————————


在一家公司里,有三个程序员,他们的名字分别是小A、小B、小C:



有一天,公司新来的产品经理有一个新需求,但她不知道这个需求应该由谁来负责。于是,她首先找到了小A:



于是,产品经理又找到了小B:


于是,产品经理又找到了小C:




像这样,一个任务从小A转移到小B,从小B转移到小C,再由小C最终处理,形成了一个完整的任务处理链条:



在上面这个链条当中,包含着不同的任务处理者。面对一个新任务,每个任务处理者需要判断自己能否处理该任务,如果能处理,则处理并返回;如果不能处理,则转交给下一个任务处理者,直到某一个任务处理者最终完成处理。这就是职责链模式的核心思想。









abstract public class Handler {

    protected Handler successor;

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

    abstract String handleRequest(String msg);
}


从上面这个抽象类可以看出,每一个Handler对象都包含着一个successor成员,指向它的下一个任务处理者,就像链表节点的next指针一样。


public class HandlerA extends Handler {
    @Override
    String handleRequest(String msg) {
        if(msg.contains("a")){
            msg = msg.replace('a''*');
        } else if(this.successor != null){
            msg = this.successor.handleRequest(msg);
        }
        return msg;
    }
}

public class HandlerB extends Handler {
    @Override
    String handleRequest(String msg) {
        if(msg.contains("b")){
            msg = msg.replace('b''*');
        } else if(this.successor != null){
            msg = this.successor.handleRequest(msg);
        }
        return msg;
    }
}

public class HandlerC extends Handler {
    @Override
    String handleRequest(String msg) {
        if(msg.contains("c")){
            msg = msg.replace('c''*');
        } else if(this.successor != null){
            msg = this.successor.handleRequest(msg);
        }
        return msg;
    }
}


在这三个Handler实现类中,做了相似的判断:


如果传入的消息字符串包含某个字母,则把对应的字母替换成*。一旦某个Handler替换了自己所负责的字母,就直接结束整个链路;如果没有自己所负责的字母,则指定下一个Handler继续处理。


public class Client {

    public static void main(String[] args{
        Handler handlerA = new HandlerA();
        Handler handlerB = new HandlerB();
        Handler handlerC = new HandlerC();

        handlerA.setSuccessor(handlerB);
        handlerB.setSuccessor(handlerC);

        System.out.println(handlerA.handleRequest("apple"));
        System.out.println(handlerA.handleRequest("bicycle"));
        System.out.println(handlerA.handleRequest("color"));
    }
}


在客户端代码中,可以灵活设置整个链路和处理者的次序,然后直接调用第一个处理者的handleRequest方法,就相当于启动了整个链路。





做过Web开发的小伙伴都知道,当客户端对Web应用发出HTTP请求的时候,会首先经过Tomcat容器的一层层过滤器(Filter),过滤器会针对请求的访问权限、参数合法性等方面进行验证和过滤。


这一层一层过滤器的实现,就使用了职责链模式。


熟悉SpringMVC框架源码的小伙伴应该都知道,客户端的HTTP请求到了Web应用之后,会被SpringMVC框架的DispatcherServlet类进行分发,分发给Controller层的具体方法。


在进入Controller层的业务逻辑之前,以及执行完业务逻辑之后,该请求都会经过一系列的拦截器(Interceptor)。这一系列拦截器的处理流程,也同样是职责链模式的实现。



—————END—————



©著作权归作者所有:来自51CTO博客作者mob604756fef1ec的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 熔断原理与实现Golang版
  2. 常用的几款抓包工具_ 常见的4种抓包工具比较
  3. Nginx的五种负载均衡策略
  4. WEB请求处理(2):Nginx 请求反向代理
  5. 全国各地车牌查询表-收录及时更新的应用数据
  6. 分享一下如何利用 Python测试 完成验签操作
  7. 前端教程分享:HTTP请求Content-Type你知道是做什么的吗?
  8. 打开API网关设计的一扇窗
  9. Django 中间件

随机推荐

  1. 阿里云也有 IDEA 插件 Cloud Toolkit
  2. 芋道 Spring Cloud Alibaba 注册中心 Nac
  3. pytest测试入门篇(ExitCode退出码)
  4. 芋道 Spring Boot 自动配置原理
  5. 芋道 Spring Boot 热部署入门
  6. 芋道 Spring Boot MyBatis 入门
  7. 芋道 Spring Boot 消除冗余代码 Lombok
  8. 芋道 Spring Boot 数据库连接池入门
  9. Caused by: java.lang.IllegalStateExcep
  10. RocketMQ 源码解析 —— 调试环境搭建