Gin、GORM 中责任链模式的使用
责任链模式在 GoF 的《设计模式》一书中是这样定义的
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.
解耦请求的发送和接收,让多个接收对象都有机会处理这个请求。请求在多个串联的对象中传递,直到有对象能处理它。看下面这个例子
package main
import "fmt"
type HandlerFunc func(*Request) bool
type Request struct {
url string
handlers []HandlerFunc
}
func (r *Request) Use(handlerFunc HandlerFunc) {
r.handlers = append(r.handlers, handlerFunc)
}
func (r *Request) Run() {
for _, handler := range r.handlers {
if handler(r) {
break
}
}
}
// 测试
// 输出 2
func main() {
r := &Request{}
r.Use(func(r *Request) bool {
return false
})
r.Use(func(r *Request) bool {
fmt.Print(2, " ")
return true
})
r.Use(func(r *Request) bool {
fmt.Print(3, " ")
return true
})
r.Run()
}
例子中定义了一个请求 Request,请求可以被多个 HandlerFunc 处理,如果某个 HandlerFunc 处理成功则结束处理,其中 HandlerFunc 可以通过 Request.Use() 方法进行添加。