chiachan
chiachan
Published on 2020-08-30 / 676 Visits
0

Decorator模式(装饰器模式)

什么是装饰者模式?

  • 装饰者模式即保持装饰者和被装饰者的一致性
  • 可以不断地为对象添加装饰
  • 主要目的就是通过添加装饰物来增加类的功能

示范代码(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)
}