假设一个注册场景,我们需要对参数进行校验,那么如果我们需要实现当前的参数校验的功能,我们可能就需要使用多个if来进行对参数进行校验。
使用if的来实现注册参数校验的过程:
if (···· != ···· ) {
return ....;
} else if (···· != ····) {
return ....;
} .......
由于多重的if判断语句导致了代码可能出现难以维护和代码冗余的可能,这时候使用责任链模式那么我们就能很好的避免这种情况。
下面是使用责任链模式的使用示例
type ChainHandler struct {
Func func(request any) any
Order int
}
type ChainContext struct {
handlers []ChainHandler
}
func NewChainContext() *ChainContext {
return &ChainContext{}
}
// AddHandler 添加处理器到上下文
func (ctx *ChainContext) AddHandler(handler ChainHandler) {
ctx.handlers = append(ctx.handlers, handler)
}
// Execute 责任链执行
func (ctx *ChainContext) Execute(request any) {
sort.Slice(ctx.handlers, func(i, j int) bool {
return ctx.handlers[i].Order < ctx.handlers[j].Order
})
for _, handler := range ctx.handlers {
handler.Func(request)
}
}
实现当前的责任链
package main
import "fmt"
func main() {
ctx := NewChainContext()
handler1 := ChainHandler{
Order: 2,
Func: func(request any) any {
fmt.Println("handler1")
return request
},
}
handler2 := ChainHandler{
Order: 1,
Func: func(request any) any {
fmt.Println("handler2")
return request
},
}
ctx.AddHandler(handler1)
ctx.AddHandler(handler2)
ctx.Execute(ctx.handlers)
}