美文网首页
装饰器模式

装饰器模式

作者: 简书网abc | 来源:发表于2021-06-20 00:36 被阅读0次
    package main
    
    import (
        "fmt"
        "time"
    )
    
    // 装饰器模式,动态地给一个对象添加一些额外的职责,
    //就增加功能来说,装饰器模式比生成子类更加灵活。
    //它把每个要装饰的功能放在单独的类中,
    //并让这个类包装它所要装饰的对象,在使用时要注意装饰的顺序。
    
    //比如我们想给核心代码添加日志打印功能,
    //但是又不能改动原有代码,可以使用装饰器模式来包装原有的代码
    
    
    // 工作代码
    func Work() {
        fmt.Println("工作中...")
        time.Sleep(time.Second)
    }
    
    // 工作代码——需要接受参数
    func WorkWithArgs(name string) {
        fmt.Printf("%s——工作中...\n", name)
        time.Sleep(time.Second * 2)
    }
    
    // 加入工作代码的函数签名与Logger()函数的参数不匹配,
    //这时候可以使用桥接模式定义一个桥接函数,来把2个函数桥接起来:
    
    // 工作方法与装饰器不匹配,用中间方法进行桥接
    func Bridge(f func(string), name string) func() {
        return func() {
            f(name)
        }
    }
    
    
    // 定义一个装饰器函数来包装工作代码:
    // logger函数包装工作代码
    func Logger(f func()) {
        now := time.Now()
        fmt.Printf("开始:%v\n", now.Format("2006-01-02 15:04:05.000"))
        f() // 工作代码
        end := time.Now()
        fmt.Printf("结束:%v\n", end.Format("2006-01-02 15:04:05.000"))
        fmt.Printf("耗时:%v\n", end.Sub(now))
    }
    
    func main()  {
        work := Work
        // 直接调用work()
        work()
        fmt.Println("-------------------------------------")
    
        // 使用装饰器调用work()
        Logger(work)
        fmt.Println("-------------------------------------")
    
        // 桥接方法
        work2 := WorkWithArgs
        bridge := Bridge
        Logger(bridge(work2, "[工作方法]"))
    }
    

    相关文章

      网友评论

          本文标题:装饰器模式

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