什么是装饰者模式?
- 装饰者模式即保持装饰者和被装饰者的一致性
- 可以不断地为对象添加装饰
- 主要目的就是通过添加装饰物来增加类的功能
示范代码(decorator.go)
计算函数运行时间
package Decorator
import (
"log"
"math"
"time"
)
type FuncPi func(n int) float64
// 装饰器 计算函数运行时间
func WrapLogger(funcPi FuncPi, logger *log.Logger) FuncPi {
return func(n int) float64 {
fn := func(n int) (result float64) {
defer func(t time.Time) {
logger.Printf("took=%v,n=%v,result=%v", time.Since(t), n, result)
}(time.Now())
return funcPi(n)
}
return fn(n)
}
}
func CalculatePI(n int) float64 {
ch := make(chan float64)
for k := 0; k < n; k++ {
go func(ch chan float64, k float64) {
ch <- 4 * math.Pow(-1, k) / (2*k + 1)
}(ch, float64(k))
}
result := 0.0
for i := 0; i < n; i++ {
result += <-ch
}
return result
}
测试用例(decorator_test.go)
package Decorator
import (
"log"
"os"
"testing"
)
func TestWrapLogger(t *testing.T) {
logger := log.New(os.Stdout, "test ", 1)
f := WrapLogger(CalculatePI, logger)
f(5000)
f(10000)
f(100000)
f(1000000)
}