策略模式通过接口定义算法行为,如SortStrategy接口,实现多种排序结构体(BubbleSort、QuickSort),由上下文Sorter动态切换策略,避免条件判断,提升扩展性。

在Go语言中,策略模式能有效实现算法的可插拔设计,让程序在运行时根据需要切换不同的实现。核心思想是将算法封装成独立的类型,并通过统一接口调用,从而避免大量条件判断,提升代码的扩展性和可维护性。
先定义一个公共接口,描述算法的行为。比如我们要实现不同方式的数据排序:
<pre class="brush:php;toolbar:false;">type SortStrategy interface {
Sort([]int) []int
}
这个接口只有一个方法 Sort,所有具体的排序算法都需要实现它。
接下来编写几种不同的排序实现:
立即学习“go语言免费学习笔记(深入)”;
<pre class="brush:php;toolbar:false;">type BubbleSort struct{}
<p>func (b *BubbleSort) Sort(data []int) []int {
sorted := make([]int, len(data))
copy(sorted, data)
for i := 0; i < len(sorted); i++ {
for j := 0; j < len(sorted)-i-1; j++ {
if sorted[j] > sorted[j+1] {
sorted[j], sorted[j+1] = sorted[j+1], sorted[j]
}
}
}
return sorted
}</p><p>type QuickSort struct{}</p><p>func (q *QuickSort) Sort(data []int) []int {
if len(data) <= 1 {
return data
}
sorted := make([]int, len(data))
copy(sorted, data)
quickSortHelper(sorted, 0, len(sorted)-1)
return sorted
}</p><p>func quickSortHelper(arr []int, low, high int) {
if low < high {
pi := partition(arr, low, high)
quickSortHelper(arr, low, pi-1)
quickSortHelper(arr, pi+1, high)
}
}</p><p>func partition(arr []int, low, high int) int {
pivot := arr[high]
i := low - 1
for j := low; j < high; j++ {
if arr[j] < pivot {
i++
arr[i], arr[j] = arr[j], arr[i]
}
}
arr[i+1], arr[high] = arr[high], arr[i+1]
return i + 1
}</p>每种排序都是独立结构体,互不影响,便于测试和替换。
创建一个上下文结构体来持有当前策略,并提供切换和执行的能力:
<pre class="brush:php;toolbar:false;">type Sorter struct {
strategy SortStrategy
}
<p>func (s *Sorter) SetStrategy(strategy SortStrategy) {
s.strategy = strategy
}</p><p>func (s *Sorter) Execute(data []int) []int {
if s.strategy == nil {
panic("未设置排序策略")
}
return s.strategy.Sort(data)
}</p>这样可以在运行时动态更换算法:
<pre class="brush:php;toolbar:false;">data := []int{5, 2, 9, 1, 5, 6}
<p>sorter := &Sorter{}
sorter.SetStrategy(&BubbleSort{})
result1 := sorter.Execute(data) // 使用冒泡排序</p><p>sorter.SetStrategy(&QuickSort{})
result2 := sorter.Execute(data) // 使用快速排序</p>如果未来要新增归并排序,只需实现 SortStrategy 接口,无需修改现有逻辑。
策略模式特别适合以下场景:
通过接口抽象,调用方只依赖行为定义,不关心具体实现,系统更灵活,也更容易做单元测试。
基本上就这些。Go没有继承,但通过接口和组合,能非常自然地实现策略模式,写出清晰、可扩展的代码。
以上就是Golang如何使用策略模式实现可插拔算法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号