在 Go 語言中,可以使用函數作為參數和返回值的特性來實現裝飾器模式。
下面是一個示例代碼,演示了如何使用裝飾器模式來增加函數的功能:
package main
import "fmt"
// 定義一個原始的函數類型
type FooFunc func()
// 原始的函數
func Foo() {
fmt.Println("This is the original function.")
}
// 裝飾器函數類型
type DecoratorFunc func(FooFunc) FooFunc
// 裝飾器函數,用于在原始函數執行前后增加額外的功能
func Decorator(f FooFunc) FooFunc {
return func() {
fmt.Println("Before calling the original function.")
f() // 調用原始函數
fmt.Println("After calling the original function.")
}
}
func main() {
// 創建一個裝飾器函數
decoratedFoo := Decorator(Foo)
// 調用裝飾后的函數
decoratedFoo()
}
運行以上代碼,輸出結果為:
Before calling the original function.
This is the original function.
After calling the original function.
在這個示例代碼中,Foo
是一個原始的函數,Decorator
是一個裝飾器函數。裝飾器函數接受一個函數類型作為參數,返回一個具有相同函數類型的函數。
裝飾器函數在調用原始函數之前和之后都可以添加額外的功能代碼。在這個例子中,裝飾器函數在調用原始函數之前打印了一行 “Before calling the original function.” 的信息,在調用原始函數之后打印了一行 “After calling the original function.” 的信息。
通過使用裝飾器模式,我們可以在不修改原始函數代碼的情況下,動態地增加額外的功能。