高阶函数

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

装饰器模式

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

通过高阶函数实现装饰器

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. // AddFunc 定义一个方法类型
  7. type AddFunc func(int, int) int
  8. //Add 基础的Add方法
  9. func Add(a, b int) int {
  10. return a + b
  11. }
  12. //AddDecorator 装饰器方法
  13. func AddDecorator(f AddFunc) AddFunc {
  14. return func(a, b int) int {
  15. start := time.Now() // 起始时间
  16. c := f(a, b) // 执行乘法运算函数
  17. end := time.Since(start) // 函数执行完毕耗时
  18. fmt.Printf("--- 执行耗时: %v ---\n", end)
  19. return c // 返回计算结果
  20. }
  21. }
  22. func main() {
  23. a := 8
  24. b := 10
  25. decorator := AddDecorator(Add)
  26. result := decorator(a, b)
  27. fmt.Println(result)
  28. }

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