责任链模式 go的实现

66 阅读1分钟

假设一个注册场景,我们需要对参数进行校验,那么如果我们需要实现当前的参数校验的功能,我们可能就需要使用多个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)
}