责任链模式详解(角色优缺点及应用实例)

责任链模式详解(角色优缺点及应用实例)-mikechen

责任链模式定义

责任链模式:在这种模式中,通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

 

责任链模式角色

责任链模式主要包含以下角色,如下图所示:

责任链模式详解(角色优缺点及应用实例)-mikechen

1.抽象处理者(Handler)角色

抽象处理者(Handler):定义一个处理请求的接口,包含抽象处理方法,和一个后继连接。

 

2.具体处理者(Concrete Handler)角色

具体处理者(Concrete Handler):实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

 

3.客户类(Client)角色

客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节,和请求的传递过程。

 

责任链模式优缺

1.责任链模式优点 

  • 责任链模式的优点是将请求和处理分开,请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦。
  • 责任链模式可以 动态组合 , 使用配置设置责任链的顺序,可以随时对责任链排序 ,,随时增加拆除责任链中的某个请求对象 。

2.责任链模式缺点 

  • 责任链有两个非常显著的缺点,是性能问题 ,如果 责任链 太长 ,或责任链中请求的 处理时间过长 , 可能会 影响性能 ;
  • 调试不很方便,特别是链条比较长,责任链可能过多,调试的时候逻辑可能比较复杂。

 

责任链模式实例

责任链有很多的使用场景,但是最适合用的还是:重构存在很多使用if-else判断逻辑的代码。

我们来看一个生活的结婚案例,可以非常直观的理解责任链模式。

先看原始代码逻辑,如果if-else越来越多,该多就越来越大,不可控维护。

责任链模式详解(角色优缺点及应用实例)-mikechen

下面我们改造成责任链模式,大致分为如下3步:

1.构造责任链上的每一个节点

责任链模式详解(角色优缺点及应用实例)-mikechen

2.构造责任链的链子

责任链模式详解(角色优缺点及应用实例)-mikechen

3.测试责任链模式

责任链模式详解(角色优缺点及应用实例)-mikechen

上面只是简要的示例,真实的业务场景中,如果判断越来越多,if / else就会非常庞大,很难维护。

责任链模式就可以发挥作用,可以提高程序的可读性、以及程序的可维护性。

 

责任链模式应用

  • 责任链有很多的使用场景,但是最适合用的还是重构存在很多使用if-else判断逻辑的代码;
  • 在日常生活中责任链模式还是很常见的,比如:各部门协同合作完成某些任务,而每个部门都有各自的职责,因此很多时候事情完成一半便会转交给下一个部门,直至所有部门都通过一遍后事情才能完成;
  • 除此之外,还有Java框架的Struts2 的拦截器;
  • 以及Servlet 的Filter实现都是责任链模式的应用。

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法