类似于责任链模式吧,不同类实现相同的入参,执行不同的操作,一个执行完再确定要不要执行下一个。
用go实现:
1.定义一个接口
后面所有的handler都要实现这个接口的handler方法
type IHandler interface {
/**
true 表示通过 false 表示后面就不用再跑了
*/
Handler(requestSeatContext *model.RequestSeatContext) bool
}
2.定义接口的入参,
为了测试,只写一个参数,参数只有一个属性,代表是否执行下一个handler
实际生成中,各个handler就是靠这个传递信息的
type RequestSeatContext struct {
LastHandlerOK bool
}
3.定义接口实现,
我们定义3个实现对象
a.解析参数的handler
b.执行abtest的handler
c.输出log日志的handler
type RequestHandler struct {
name string
}
func (handler *RequestHandler) Handler(requestSeatContext *model.RequestSeatContext) bool {
if !requestSeatContext.LastHandlerOK {
return false
}
fmt.Println("RequestHandler 执行")
return true
}
type AbTestHandler struct {
name string
}
func (handler *AbTestHandler) Handler(requestSeatContext *model.RequestSeatContext) bool {
if !requestSeatContext.LastHandlerOK {
return false
}
fmt.Println("AbTestHandler 执行")
return true
}
type LogHandler struct {
name string
}
func (handler *LogHandler) Handler(requestSeatContext *model.RequestSeatContext) bool {
if !requestSeatContext.LastHandlerOK {
return false
}
fmt.Println("LogHandler 执行")
return true
}
4.确定handler执行顺序,定义各个handler组成的数组
var (
requestHandlers []IHandler
)
requestHandlers = []IHandler{
&myhandler.RequestHandler{}, //1. 解析参数
&AbTestHandler{}, //2. abtest
&LogHandler{}, //3. 日志处理
}
5.初始化handler入参
requestSeatContext := &model.RequestSeatContext{
LastHandlerOK:true,
}
6.执行handler
//执行
for _, handler := range requestHandlers {
requestSeatContext.LastHandlerOK = handler.Handler(requestSeatContext)
}
执行结果
RequestHandler 执行
AbTestHandler 执行
LogHandler 执行
如果把中间的AbTestHandler的handler方法的返回值改为false
执行结果就变成:
RequestHandler 执行
AbTestHandler 执行
本文详细介绍使用Go语言实现责任链设计模式的过程。通过定义一个接口及其实现,创建多个处理器,如请求处理器、A/B测试处理器和日志处理器,它们按顺序执行,每个处理器决定是否继续传递请求到下一个处理器。此模式适用于处理复杂请求流程。

被折叠的 条评论
为什么被折叠?



