Go 实现装饰器设计模式

2020-07-19  本文已影响0人  三梦哥

有过其它编程语言的基础的话,我们就知道装饰器其实就是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)这种的调用方式呢?

上一篇下一篇

猜你喜欢

热点阅读