美文网首页
go 的装饰器模式

go 的装饰器模式

作者: wayyyy | 来源:发表于2023-03-07 10:40 被阅读0次

和 Python 一样,函数作为一等公民的语言来说,实现装饰器都比较方便。

func help(name string) {
    fmt.Println(fmt.Sprintf("help %s", name))
}

func decorator(a func(name string)) func(string) {
    return func(name string) {
        fmt.Println("decorator code before")
        a(name)
        fmt.Println("decorator code after")
    }
}

func main() {
    decoratorFunc := decorator(help)
    decoratorFunc("go")
}
image.png

如果有多个装饰器函数,那么可以:

type Func func(string)
type Decorator func(Func) Func

func decoratorsHandler(h Func, decors ...Decorator) Func {
    cnt := len(decors)
    for i := range decors {
        d := decors[cnt-1-i]
        h = d(h)
    }

    return h
}

func decorator1(a Func) Func {
    return func(name string) {
        fmt.Println("decorator code1")
        a(name)
    }
}

func decorator2(a Func) Func {
    return func(name string) {
        fmt.Println("decorator code2")
        a(name)
    }
}

func help(name string) {
    fmt.Println(fmt.Sprintf("help %s", name))
}

func main() {
    decoratorsFunc := decoratorsHandler(help, decorator1, decorator2)
    decoratorsFunc("go")
}
image.png

相关文章

网友评论

      本文标题:go 的装饰器模式

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