Go 实现装饰器设计模式

有过其它编程语言的基础的话,我们就知道装饰器其实就是ASP.NET Core里面的管道(Pipeline),C# 里面的AOP
下面,我们就是用Go的装饰器模式来实现一个函数运行时的计时器。

package main

import (
    "fmt"
    "time"
)

type handler func(int, int)

func wrapFunc(h handler) handler {
    return func(a, b int) {
        fmt.Println("Before computing...")
        start := time.Now()
        h(a, b)
        fmt.Println("The total time is ", time.Since(start))
        fmt.Println("After computing...")
    }
}

func Sum(a, b int) {
    fmt.Printf("The result is :%v\n", a+b)
}

func main() {
    foo := wrapFunc(Sum)
    foo(200, 300)
}

输出的结果为:

Before computing...
The result is :500
The total time is  5.322µs
After computing...

我们用handleFunc对其中的调用再次进行一次包装,方便调用。

package main

import (
    "fmt"
    "time"
)

type handler func(int, int)

func wrapFunc(h handler) handler {
    return func(a, b int) {
        fmt.Println("Before computing...")
        start := time.Now()
        h(a, b)
        fmt.Println("The total time is ", time.Since(start))
        fmt.Println("After computing...")
    }
}

func handleFunc(a int, b int, h handler) {
    h(a, b)
}

func Sum(a, b int) {
    fmt.Printf("The result is :%v\n", a+b)
}

func main() {
    handleFunc(100, 200, wrapFunc(Sum))
}

看到handleFunc(100, 200, wrapFunc(Sum))这种调用的方式,是不是想起了http.HandleFunc("/", IndexHandler)这种的调用方式呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。