go 的装饰器模式
2023-03-07 本文已影响0人
wayyyy
和 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")
}

如果有多个装饰器函数,那么可以:
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")
}
