美文网首页
Go 实现装饰器设计模式

Go 实现装饰器设计模式

作者: 三梦哥 | 来源:发表于2020-07-19 22:47 被阅读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)这种的调用方式呢?

    相关文章

      网友评论

          本文标题:Go 实现装饰器设计模式

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