清水泥沙

golang基础(35.通过高阶函数来实现装饰器模式)

高阶函数

高阶函数是指,接收其他函数作为参数或者作为返回值的函数。将匿名函数作为参数传入或者将匿名函数作为返回值,这都是高阶函数的一种。

装饰器模式

装饰器模式,顾名思义其特征在于装饰。在编程语言中它代表着在程序原有的基础上,在不侵入其代码,为其添加更多的功能。

通过高阶函数实现装饰器

package main

import (
	"fmt"
	"time"
)

// AddFunc 定义一个方法类型
type AddFunc func(int, int) int

//Add 基础的Add方法
func Add(a, b int) int {
	return a + b
}

//AddDecorator 装饰器方法
func AddDecorator(f AddFunc) AddFunc {
	return func(a, b int) int {
		start := time.Now()      // 起始时间
		c := f(a, b)             // 执行乘法运算函数
		end := time.Since(start) // 函数执行完毕耗时
		fmt.Printf("--- 执行耗时: %v ---
", end)
		return c // 返回计算结果
	}
}

func main() {
	a := 8
	b := 10
	decorator := AddDecorator(Add)
	result := decorator(a, b)
	fmt.Println(result)
}

上述代码中定义了一个AddFunc类型,主要是用于规范我们参数传入和返回。定义了一个具体执行的函数Add。将方法Add传入装饰方法AddDecorator中加以修饰后再将其返回执行。核心思路就是在被修饰的功能模块(这里是外部传入的乘法函数 f)执行前后加上一些额外的业务逻辑,而又不影响原有功能模块的执行。显然,装饰器模式是遵循 SOLID 设计原则中的开放封闭原则的 —— 对代码扩展开放,对代码修改关闭。在 main 函数中调用函数Add 时,如果要应用装饰器,需要通过装饰器AddDecorator包裹,装饰器返回的是个匿名函数,所以需要再度调用才能真正执行。