美文网首页
go 的职责链模式

go 的职责链模式

作者: wayyyy | 来源:发表于2023-02-12 00:36 被阅读0次

    职责链模式是一种行为涉及模式,它在很多场景都有应用,典型的像中间件,拦截器等框架组件都是应用这种设计模式。

    我们自己简单用go实现以下职责链模式,它应该应对一个流程,流程中每个步骤都应由一个处理对象来完成逻辑抽象、所有处理对象都应该提供统一的处理自身逻辑的方法,其次还应该维护指向下一个处理对象的引用,当前步骤自己逻辑处理完后,就调用下一个对象的处理方法,把请求交给后面的对象进行处理,依次递进直到流程结束。

    type Handler interface {
        Do(c *context.Context) error  //
        SetNext(h Handler) Handler    // 设置下一个流程
        Run(c *context.Context) error // 执行
    }
    
    type Next struct {
        nextHandler Handler // 下一个流程
    }
    
    func (n *Next) SetNext(h Handler) Handler {
        n.nextHandler = h
        return h
    }
    
    // Run 执行
    func (n *Next) Run(c *context.Context) error {
        if n.nextHandler != nil {
            if err := (n.nextHandler).Do(c); err != nil {
                return err
            }
    
            return (n.nextHandler).Run(c) // 执行下一个handler的Run
        }
    
        return nil
    }
    
    // NullHandler 空Handler, 作为载体
    type NullHandler struct {
        Next
    }
    
    func (h *NullHandler) Do(c *context.Context) (err error) {
        return
    }
    

    测试:

    type Arguments1Handler struct {
        Next
    }
    
    func (h *Arguments1Handler) Do(c *context.Context) (err error) {
        fmt.Println("校验参数1成功...")
        return
    }
    
    type Arguments2Handler struct {
        Next
    }
    
    func (h *Arguments2Handler) Do(c *context.Context) (err error) {
        fmt.Println("校验参数2成功...")
        return
    }
    
    func main() {
        // 初始化空handler
        nullHandler := &NullHandler{}
    
        // 链式调用
        nullHandler.SetNext(&Arguments1Handler{}).
            SetNext(&Arguments2Handler{})
    
        // 开始执行业务
        ctx := context.Background()
        if err := nullHandler.Run(&ctx); err != nil {
            fmt.Println("Fail | Error:" + err.Error())
            return
        }
    
        return
    }
    

    输出:

    image.png

    参考资料
    1、https://blog.csdn.net/zhghost/article/details/103515858

    相关文章

      网友评论

          本文标题:go 的职责链模式

          本文链接:https://www.haomeiwen.com/subject/obslkdtx.html