【Gin】深度解析:在Gin框架中优化应用程序流程的责任链设计模式(下)

【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无法处理请求,则将请求传递给下一层中间件MiddleWare2MiddleWare2处理请求,处理完毕后,返回响应给上层调用者,再由上层调用者沿责任链继续将响应信息返回给上层调用者,直至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。构建完后返回给上层的调用者HandlerHandler将路由组对象组装好后,再将组装好的路由组对象返回给GET方法,GET方法返回嵌入责任处理链的路由组对象给客户端(责任链的起始点)进行调用,客户端拿到对象后,做下一步的处理。

在这里插入图片描述

图 32 责任链Next处理业务图

在这里插入图片描述

图 33 责任链Abort拦截业务图

在上图的基础上,下面对各个模块的代码进行深入剖析:

评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寸 铁

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值