# 责任链模式
Chain of Responsibility Pattern,为请求创建了由接受者对象组成的链,通过这种模式发送的请求,可以对请求的发送者和接受者进行解耦。
同时在这种模式中每个接收者都包含对另外一个接收者的引用,使得如果当前接收者不能处理,可以将请求传递给下一个接收者处理。例如在Netty的入站处理器的pipeline中,每个处理器需要调用ctx.fireChannelRead(msg)将msg移交给下一个处理器处理。
责任链模式适用于解决当处理消息的时候有很多道“过滤”程序的场景,例如Java Web中的拦截器、Tomcat对Encoding的处理、JS的事件冒泡、Netty中的出入站处理器。
## 组成
1. Handler:定义处理请求的接口,并且实现其后继链节点(successor)。
2. handlerRequest:定义处理请求的方法,每个具体的Handler接口都需要重写handlerRequest方法来实现特点的处理。
**实现**
1. 定义Handler接口
~~~
public abstract class Handler {
// 后继处理链
protected Handler successor;
public Handler(Handler successor) {
this.successor = successor;
}
// 处理请求的方法
protected abstract void handleRequest(Request request);
}
~~~
2. 定义具体的Handler实现类
~~~
public class ConcreteHandler1 extends Handler {
public ConcreteHandler1(Handler successor) {
super(successor);
}
@Override
protected void handleRequest(Request request) {
if (request.getType() == RequestType.TYPE1) {
System.out.println(request.getName() + " is handle by ConcreteHandler1");
return;
}
if (successor != null) {
// 交由下一个处理器处理
successor.handleRequest(request);
}
}
}
~~~
JDK中实现责任链模式的代码:
* [java.util.logging.Logger#log()](http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html#log%28java.util.logging.Level,%20java.lang.String%29)
* [Apache Commons Chain](https://commons.apache.org/proper/commons-chain/index.html)
* [javax.servlet.Filter#doFilter()](http://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html#doFilter-javax.servlet.ServletRequest-javax.servlet.ServletResponse-javax.servlet.FilterChain-)
- 第一章 Java基础
- ThreadLocal
- Java异常体系
- Java集合框架
- List接口及其实现类
- Queue接口及其实现类
- Set接口及其实现类
- Map接口及其实现类
- JDK1.8新特性
- Lambda表达式
- 常用函数式接口
- stream流
- 面试
- 第二章 Java虚拟机
- 第一节、运行时数据区
- 第二节、垃圾回收
- 第三节、类加载机制
- 第四节、类文件与字节码指令
- 第五节、语法糖
- 第六节、运行期优化
- 面试常见问题
- 第三章 并发编程
- 第一节、Java中的线程
- 第二节、Java中的锁
- 第三节、线程池
- 第四节、并发工具类
- AQS
- 第四章 网络编程
- WebSocket协议
- Netty
- Netty入门
- Netty-自定义协议
- 面试题
- IO
- 网络IO模型
- 第五章 操作系统
- IO
- 文件系统的相关概念
- Java几种文件读写方式性能对比
- Socket
- 内存管理
- 进程、线程、协程
- IO模型的演化过程
- 第六章 计算机网络
- 第七章 消息队列
- RabbitMQ
- 第八章 开发框架
- Spring
- Spring事务
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 数据库
- Mysql
- Mysql中的索引
- Mysql中的锁
- 面试常见问题
- Mysql中的日志
- InnoDB存储引擎
- 事务
- Redis
- redis的数据类型
- redis数据结构
- Redis主从复制
- 哨兵模式
- 面试题
- Spring Boot整合Lettuce+Redisson实现布隆过滤器
- 集群
- Redis网络IO模型
- 第十章 设计模式
- 设计模式-七大原则
- 设计模式-单例模式
- 设计模式-备忘录模式
- 设计模式-原型模式
- 设计模式-责任链模式
- 设计模式-过滤模式
- 设计模式-观察者模式
- 设计模式-工厂方法模式
- 设计模式-抽象工厂模式
- 设计模式-代理模式
- 第十一章 后端开发常用工具、库
- Docker
- Docker安装Mysql
- 第十二章 中间件
- ZooKeeper