首页 > 后端开发 > Golang > 正文

Golang如何使用策略模式动态切换算法_Golang Strategy模式应用方法

P粉602998670
发布: 2025-12-02 19:48:07
原创
654人浏览过
策略模式通过接口定义算法族,具体实现如BubbleSort和QuickSort分别封装不同排序逻辑,Sorter上下文动态设置strategy并执行Sort方法,运行时可切换算法而不影响客户端调用。

golang如何使用策略模式动态切换算法_golang strategy模式应用方法

在Go语言中,策略模式是一种行为设计模式,它允许你定义一系列算法,并将每种算法分别放入独立的结构体中,使算法的变化独立于使用它的客户端。通过接口抽象,可以在运行时动态切换不同的实现,非常适合需要根据不同场景选择不同处理逻辑的场景。

定义策略接口

策略模式的核心是定义一个统一的接口,所有具体算法都实现这个接口。这样调用方只需依赖接口,而无需关心具体实现。

例如,假设我们要实现不同的排序算法,可以先定义一个排序策略接口:

type SortStrategy interface {
    Sort([]int) []int
}
登录后复制

这个接口声明了一个 Sort 方法,接收一个整型切片并返回排序后的结果。任何符合该接口的类型都可以作为“排序策略”被使用。

立即学习go语言免费学习笔记(深入)”;

实现具体策略

接下来,我们实现几种具体的排序算法,比如冒泡排序和快速排序:

type BubbleSort struct{}
<p>func (b *BubbleSort) Sort(data []int) []int {
n := len(data)
sorted := make([]int, n)
copy(sorted, data)
for i := 0; i < n-1; i++ {
for j := 0; j < n-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
}
登录后复制

现在我们有两个实现了 SortStrategy 接口的具体类型:BubbleSortQuickSort。它们封装了不同的算法逻辑。

上下文使用策略

创建一个上下文结构体来持有当前策略,并提供方法切换或执行策略:

稿定AI文案
稿定AI文案

小红书笔记、公众号、周报总结、视频脚本等智能文案生成平台

稿定AI文案 169
查看详情 稿定AI文案

type Sorter struct {
    strategy SortStrategy
}
<p>func (s *Sorter) SetStrategy(strategy SortStrategy) {
s.strategy = strategy
}</p><p>func (s *Sorter) ExecuteSort(data []int) []int {
if s.strategy == nil {
panic("no strategy set")
}
return s.strategy.Sort(data)
}
登录后复制

Sorter 结构体包含一个策略字段,可以通过 SetStrategy 动态更换算法。调用 ExecuteSort 时会使用当前设置的策略进行排序。

运行时动态切换示例

下面是使用示例,展示如何在运行时切换不同算法:

func main() {
    data := []int{64, 34, 25, 12, 22, 11, 90}
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">sorter := &Sorter{}

// 使用冒泡排序
sorter.SetStrategy(&BubbleSort{})
result1 := sorter.ExecuteSort(data)
fmt.Println("Bubble Sort:", result1)

// 切换为快速排序
sorter.SetStrategy(&QuickSort{})
result2 := sorter.ExecuteSort(data)
fmt.Println("Quick Sort:", result2)
登录后复制

}

输出结果:

Bubble Sort: [11 12 22 25 34 64 90]
Quick Sort: [11 12 22 25 34 64 90]
登录后复制

可以看到,同一个 Sorter 实例在不改变调用方式的情况下,执行了不同的排序逻辑。

基本上就这些。Golang通过接口和组合轻松支持策略模式,让算法替换变得灵活且可扩展。实际项目中可用于日志策略、支付方式、缓存策略等多变场景。

以上就是Golang如何使用策略模式动态切换算法_Golang Strategy模式应用方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号