关于golang:Golang-设计模式装饰模式

2次阅读

共计 1130 个字符,预计需要花费 3 分钟才能阅读完成。

简略装璜器

咱们通过一个简略的例子来看一下装璜器的简略利用,首先编写一个 hello 函数:

package main

import "fmt"

func hello() {fmt.Println("Hello World!")
}

func main() {hello()
}

实现下面代码后,执行会输入 “Hello World!”。接下来通过以下形式,在打印“Hello World!”前后各加一行日志:

package main

import "fmt"

func hello() {fmt.Println("before")
    fmt.Println("Hello World!")
    fmt.Println("after")
}

func main() {hello()
}

代码执行后输入:

`before
Hello World!
after`
当然咱们能够抉择一个更好的实现形式,即独自编写一个专门用来打印日志的 logger 函数,示例如下:

package main

import "fmt"

func logger(f func()) func() {return func() {fmt.Println("before")
        f()
        fmt.Println("after")
    }
}

func hello() {fmt.Println("Hello World!")
}

func main() {hello := logger(hello)
    hello()}

能够看到 logger 函数接管并返回了一个函数,且参数和返回值的函数签名同 hello 一样。而后咱们在原来调用 hello() 的地位进行如下批改:

`hello := logger(hello)
hello()`
这样咱们通过 logger 函数对 hello 函数的包装,更加优雅的实现了给 hello 函数减少日志的性能。执行后的打印后果仍为:

`before
Hello World!
after`
其实 logger 函数也就是咱们在 Python 中常常应用的装璜器,因为 logger 函数不仅能够用于 hello,还能够用于其余任何与 hello 函数有着同样签名的函数。

当然如果想应用 Python 中装璜器的写法,咱们能够这样做:

package main

import "fmt"

func logger(f func()) func() {return func() {fmt.Println("before")
        f()
        fmt.Println("after")
    }
}

// 给 hello 函数打上 logger 装璜器

@logger
func hello() {fmt.Println("Hello World!")
}

func main() {
    // hello 函数调用形式不变
    hello()}

但很遗憾,下面的程序无奈通过编译。因为 Go 语言目前还没有像 Python 语言一样从语法层面提供对装璜器语法糖的反对。

正文完
 0