策略模式(Strategy)定义了一系列算法,并使它们可以互相替换。在Go中,可以使用接口实现策略模式:
package strategy
import (
"fmt"
"sort"
)
// 定义排序策略接口
type SortStrategy interface {
Sort([]int) []int
GetName() string
}
// 冒泡排序策略
type BubbleSort struct{}
func (s BubbleSort) Sort(data []int) []int {
fmt.Println("使用冒泡排序...")
result := make([]int, len(data))
copy(result, data)
n := len(result)
for i := 0; i < n; i++ {
for j := 0; j < n-i-1; j++ {
if result[j] > result[j+1] {
result[j], result[j+1] = result[j+1], result[j]
}
}
}
return result
}
func (s BubbleSort) GetName() string {
return "冒泡排序"
}
// 快速排序策略
type QuickSort struct{}
func (s QuickSort) Sort(data []int) []int {
fmt.Println("使用快速排序...")
result := make([]int, len(data))
copy(result, data)
sort.Ints(result) // 使用Go标准库的排序(实际为快排)
return result
}
func (s QuickSort) GetName() string {
return "快速排序"
}
// 上下文
type SortContext struct {
strategy SortStrategy
}
// 设置排序策略
func (c *SortContext) SetStrategy(strategy SortStrategy) {
c.strategy = strategy
}
// 执行排序
func (c *SortContext) ExecuteSort(data []int) []int {
return c.strategy.Sort(data)
}
// main.go
package main
import (
"fmt"
"myapp/strategy"
"time"
)
func main() {
// 创建上下文
ctx := &strategy.SortContext{}
// 准备数据
data := []int{9, 3, 7, 5, 1, 8, 2, 6, 4}
// 使用冒泡排序
ctx.SetStrategy(strategy.BubbleSort{})
start := time.Now()
result1 := ctx.ExecuteSort(data)
elapsed1 := time.Since(start)
fmt.Printf("排序结果: %v (耗时: %v)\n", result1, elapsed1)
// 使用快速排序
ctx.SetStrategy(strategy.QuickSort{})
start = time.Now()
result2 := ctx.ExecuteSort(data)
elapsed2 := time.Since(start)
fmt.Printf("排序结果: %v (耗时: %v)\n", result2, elapsed2)
}