优势数组
下降耦合度。它将请求的发送者和接收者解耦架构
简化了对象,使得对象不须要知道链的结构 app
加强给对象指派职责的灵活性,容许动态地新增或者删除责任链 异步
增长新的请求处理类方便性能
缺点学习
不能保证请求必定被接收;spa
系统性能将受到必定影响,调试时不方便,可能会形成循环调用设计
Handler(抽象处理者) : 定义一个处理请求的接口,提供对后续处理者的引用 调试
ConcreteHandler(具体处理者) : 抽象处理者的子类,处理用户请求,可选将请求处理掉仍是传给下家;在具体处理者中能够访问链中下一个对象,以便请求的转发code
责任链
代码详解:
抽象处理者
具体处理者
在当前处理者对象没法处理时,将执行权传给下一个处理者对象
Client 客户端调用
ifelse
咱们来分析Spring中Filter的 加载流程和执行流程
初始化过滤器加载数据流以下:
filter初始化加载时序图
关键性代码
configure()
无论是数据走哪里,最终会经过 System.arraycopy 数组扩容,增长过滤器信息到 private FilterMap[] array
这个数组中。
最后调用StandardContext类中的 filterStart()
方法完成过滤器的初始化
主要分两步, 建立过滤器责任链 和 执行责任链
3.2.1 建立过程
建立filterChain方法主要在 ApplicationFilterFactory.createFilterChain(request, wrapper, servlet)
中,部分代码讲解:
在StandardWrapperValue类的 invoke()
方法中调用ApplicationFilterChai类的 createFilterChain()
方法
在ApplicationFilterChai类的 createFilterChain()
方法中调用ApplicationFilterChain类的 addFilter()
方法
在ApplicationFilterChain类的 addFilter()
方法中给ApplicationFilterConfig数组赋值
生成调用链
3.2.2 执行责任链
调用ApplicationFilterChain的 doFilter()
方法中最后会调用一个 internalDoFilter()
方法,目的就是执行ApplicationFilterChain中的所有过滤器,从代码中能够发现它调用了 doFilter
,而在 doFilter
又会调用 internalDoFilter
从而使全部Filter都得以调用
这样,一个完整的过滤器链就造成,而后进行调用
业务场景
咱们在项目中使用了阿里的MQ消息中间件,来加快请求的响应时间和异步解耦处理。RocktMQ主要能够按Topic来分区,而后按Tag分组,不一样的业务区分不一样的 tag
好比: 在此我向你们推荐一个架构学习交流裙。交流学习裙号:687810532,里面会分享一些资深架构师录制的视频录像
短信类的消息 messageTag
手机推送消息 pushTag
延时任务消息 delayTag
等等。。。
常规写法
ifelse
具体设计方案以下:
设计UML类图
类图
抽象公共监听器 ,主要用到了单例模式获取常量
具体监听器 ,监听器主要用于MQ监听消费Topic
consume()
抽象处理者
具体处理者 :推送消息Handler
具体处理者 :延时订单处理Handler
模式工厂 HandlerFactory
getHandlerResponsibilityChain()
客户端调用
getHandlerResponsibilityChain()