作用与场景
过滤或者拦截数据;
servlet中的filter、mvc中的拦截器、dubbo中的filter、消费者对重复消息/垃圾消息的过滤等
责任链模式的几个角色
- 入口数据对象inputObj:传入到责任链中流转的数据
- 出口数据对象outputObj:责任链处理完之后的对象
- 责任链对象xxxxFilter:不同的责任链对象,负责不同的责任
- 责任链对象集合FilterChain:存储所有责任链对象,存储数据处理对象
- 客户端对象Client:执行具体的责任链
责任链模式关系图
举例:
MQ消费者对重复消息/垃圾消息的过滤(其实是拦截器);
正常流程:如果消息没被过滤掉,则做保存处理;
异常流程:如果碰到的是重复消息或者垃圾消息,则直接跳过后面的Filter,然后做丢弃处理;
入口数据对象inputObj
1 | class Request { |
出口数据对象outputObj
1 | class Response { |
责任链对象xxxxFilter
1 | /** |
责任链对象集合FilterChain
1 | class FilterChain { |
客户端对象Client
1 | public class Client { |
责任链模式总结:
优点:
- 可以扩展多种过滤业务,方便后续维护;
缺点:
- 责任链太长或者每条链判断处理的时间太长会影响性能;
- 每次都是从链头开始:这也正是链表的缺点。
设计模式系列文章: