首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

调用像链子,责任链模式

0x01:责任链模式简介

在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上进行传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。责任链模式的UML类图如下:

其中,Handler是抽象处理者,定义了一个处理请求的接口;ConcreteHandler是具体处理者,处理它所负责的请求,可访问它的后继者,如果可处理该请求就处理,否则就将该请求转发给它的后继者。主要角色如下:

抽象处理者(Handler):定义出一个处理请求的接口。如果需要接口可以定义出一个方法以设定和返回对下一个处理对象的引用。这个角色通常由一个抽象类或者接口实现。Handler类的聚合关系给出了具体子类对下一个处理对象的引用,抽象方法handleRequest()规范了子类处理请求的操作。

具体处理者(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下一个Handler处理。由于具体处理者持有对一个处理对象的引用,因此,如果需要具体处理者可以访问下一个处理对象。

0x02:责任链模式实现

在工作中,免不了需要进行报销。现在与报销这个业务流程来实现责任链模式。约定如下:

报销金额 0 ~ 1W 直属上司审批即可,报销级别为1;

报销金额 1W+ ~ 5W 部门经理审批即可,报销级别为2;

报销金额 5W+ 公司负责人审批,报销级别为3;

Request类负责封装请求,具体内容需根据业务产生

Response类负责封装链中返回的结果,具体内容需根据业务产生

抽象处理者(Handler)

具体处理者(ConcreteHandler)

直属上司

部门长

公司负责人

责任链模式测试代码

0x03:责任链模式在框架的运用

责任链模式的运用可是说非常广泛,下面来了解一下都有哪些框架使用了该设计模式

J2EE

在Servlet技术中,分别定义了一个 Filter 和 FilterChain 接口

Filter接口

FilterChain接口

核心处理类ApplicationFilterChain

在使用Filter时,如果需要交给下一个Filter处理,都会调用如下一段代码:

SpringMVC

如果有看过SpringMVC的DispatcherServlet类的源码,可以看到如下一段代码

HandlerExecutionChain类是一个责任链,其中的方法 applyPreHandler() , applyPostHandle() 和 triggerAfterCompletion() 相当于具体的处理类;在 DispatcherServlet 类的 doDispatch() 方法中进行条件判断实现处理的传递。如果想深入了解 HandlerExecutionChain 类的调用关系,可以跟踪一下 DispatcherServlet 类的 doDispatch() 方法。

喜欢,在看

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210105A01T2600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券