【Gin】深度解析:在Gin框架中优化应用程序流程的责任链设计模式(下)
大家好 我是寸铁👊
【Gin】深度解析:在Gin框架中优化应用程序流程的责任链设计模式(下)✨
喜欢的小伙伴可以点点关注 💝

前言
本次文章分为上下两部分,上部分为对理论的介绍,下部分为具体的底层代码深度剖析和编程实践,感兴趣的伙伴不要错过哦~
责任链设计模式作为一种经典的行为设计模式,在现代软件开发中扮演着重要角色。特别是在高效的Web应用开发中,如Gin框架这样的轻量级Go语言Web框架,合理地应用责任链模式可以显著提升代码的可扩展性和灵活性。本文将深入探讨在Gin框架中责任链模式的实现原理、优化策略以及实际应用场景。
责任链模式通过将请求的发送者和接收者解耦,将多个对象连成一条链,并在链上传递请求,直到有对象处理该请求为止。在Gin框架中,利用责任链模式可以有效地处理请求的流程控制、中间件管理和异常处理,使得代码结构更加清晰和可维护。本文将探索如何在Gin框架中设计和优化责任链模式,以提升应用程序的性能和可维护性。
关键的类图和时序图
(1)类图
责任链模式包含以下几个主要角色:
Handler(抽象处理者):
声明一个处理请求的接口,通常包含一个指向下一个处理者的引用。
MiddlerWare(具体处理者):
Gin的中间件实现抽象处理者的处理方法,并根据自身的处理能力决定是否处理请求,如果不能处理则将请求传递给下一个处理者。
Client(客户端):
创建一个具体处理者对象的链,并向链上的第一个处理者对象发送请求。

图 28 责任链模式类图
由类图28可得:先声明一个处理请求的接口
Handler,通常聚合一个指向下一个处理者的引用successor。声明处理请求的方法handlerRequest(),由具体的中间件责任方MiddleWare实现。接着Gin的中间件实现抽象处理者的处理方法,调用handlerRequest()方法根据自身的处理能力决定是否处理请求,如果不能处理则将请求传递给下一个处理者nextHandler。客户端创建一个具体处理者对象的链,并向链上的第一个处理者对象发送请求。
(2)时序图

图 29 责任链模式时序图
由上图29可得:客户端发送请求:客户端调用具体处理者链的第一个处理者的
handleRequest()方法,将请求request传递给链的起始点MiddleWare1。
责任链中的处理者Midlleware处理请求:每个具体中间件处理者Midlleware收到请求后,根据自己的处理能力决定是否处理请求。
请求传递到合适的处理者:如果当前处理者能够处理请求,则处理完成;如果不能处理,则将请求传递给链中的下一个处理者Midlleware。
链的末端处理:请求request会沿着链依次传递,直到被处理或者到达链的末端。如果末端处理者能够处理请求processing Request,则处理完成后,沿着责任链返回处理完后的响应信息response`。如果整个链上的处理者都不能处理请求,则请求最终未被处理。
主程序的流程
由下图30可知:一开始,
Client客户端构建责任链后,开始发起请求,责任链的中间件MiddleWare1开始接收请求,然后处理请求,处理完毕后,返回响应给上层调用者,如果客户端接收到响应后,则程序退出。
接着如果责任链的中间件MiddleWare1无法处理请求,则将请求传递给下一层中间件MiddleWare2,MiddleWare2处理请求,处理完毕后,返回响应给上层调用者,再由上层调用者沿责任链继续将响应信息返回给上层调用者,直至Client客户端。
如果责任链的中间件MiddleWare2无法处理请求,则将请求传递给下一层中间件MiddleWare……,MiddleWare……处理请求,处理完毕后,返回响应给上层调用者,再由上层调用者沿责任链继续将响应信息返回给上层调用者,直至Client客户端。
如果责任链的中间件都无法处理请求,则将请求传递给最后一层中间件FinalMiddleWare处理请求,处理完毕后,返回响应给上层调用者,再由上层调用者沿责任链继续将响应信息返回给上层调用者,直至Client客户端。如果最后一层中间件FinalMiddleWare都无法处理请求,则责任链程序结束退出。

图 30 责任链模式主程序流程图
程序模块之间的调用关系
下图为程序各模块之间的调用关系:

图 31 责任链模式程序模块调用图
由上图31可知,责任链模式主要有如下3个角色:
(1) IRoutes(处理者):
定义处理请求的接口,通常包含一个处理方法(handle),其具体实现方(ConcreteHandler)实现处理请求的方式。每个处理者对象中通常会包含一个指向下一个处理者的引用(后继者)。
(2) CombineHandlers(具体处理者):
实现 IRoutes接口,处理请求的具体逻辑。如果自己能够处理请求,则处理;否则将请求传递给下一个处理者。当然,也可以设置拦截请求,将请求只在本层进行处理,不传递给下一层责任方进行处理。
(3) Client(客户端):
负责创建和提交请求对象。按照指定的顺序构建责任链,可以设置拦截器,用于拦截请求,最后将请求发送到链的起始点。
下面是对上图各层次调用关系的描述:
客户端调用
r.GET进行按照指定的顺序构建责任链,GET方法实现IRoutes接口,GET方法将构建路由组对象的请求转发给真正的构建路由组对象的handle方法,该handle方法实现IRoutes接口。handle方法进一步转发构建GET中指定顺序的中间件责任链请求给具体处理者CombineHandlers,具体处理者CombineHandlers负责按照客户端指定的顺序构建中间件责任链。责任链中的每一个处理者存在Next()和Abort()方法,调用Next()方法遍历责任链中的请求者对象,依次将请求传递给链中的具体处理者对象业务图见下图32。Abort()方法设置索引为超出合法范围的值,使得不将请求转发给下一个处理者,实现拦截效果,业务图见下图33。构建完后返回给上层的调用者Handler,Handler将路由组对象组装好后,再将组装好的路由组对象返回给GET方法,GET方法返回嵌入责任处理链的路由组对象给客户端(责任链的起始点)进行调用,客户端拿到对象后,做下一步的处理。

图 32 责任链Next处理业务图

图 33 责任链Abort拦截业务图
在上图的基础上,下面对各个模块的代码进行深入剖析:

最低0.47元/天 解锁文章
1093





