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

在Go语言中,策略模式能有效实现算法的可插拔设计,让程序在运行时根据需要切换不同的实现。核心思想是将算法封装成独立的类型,并通过统一接口调用,从而避免大量条件判断,提升代码的扩展性和可维护性。
定义策略接口
先定义一个公共接口,描述算法的行为。比如我们要实现不同方式的数据排序:
type SortStrategy interface { Sort([]int) []int}这个接口只有一个方法 Sort,所有具体的排序算法都需要实现它。
实现具体策略
接下来编写几种不同的排序实现:
立即学习“go语言免费学习笔记(深入)”;
type BubbleSort struct{}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 sorted[j+1] {sorted[j], sorted[j+1] = sorted[j+1], sorted[j]}}}return sorted}
type QuickSort struct{}
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}
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)}}
func partition(arr []int, low, high int) int {pivot := arr[high]i := low - 1for 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}
每种排序都是独立结构体,互不影响,便于测试和替换。
Weights.gg
多功能的AI在线创作与交流平台
3352 查看详情
![]()
使用上下文管理策略
创建一个上下文结构体来持有当前策略,并提供切换和执行的能力:
type Sorter struct { strategy SortStrategy}func (s *Sorter) SetStrategy(strategy SortStrategy) {s.strategy = strategy}
func (s *Sorter) Execute(data []int) []int {if s.strategy == nil {panic("未设置排序策略")}return s.strategy.Sort(data)}
这样可以在运行时动态更换算法:
data := []int{5, 2, 9, 1, 5, 6}sorter := &Sorter{}sorter.SetStrategy(&BubbleSort{})result1 := sorter.Execute(data) // 使用冒泡排序
sorter.SetStrategy(&QuickSort{})result2 := sorter.Execute(data) // 使用快速排序
如果未来要新增归并排序,只需实现 SortStrategy 接口,无需修改现有逻辑。
实际应用场景
策略模式特别适合以下场景:
多种支付方式(微信、支付宝、银联)不同数据压缩算法(gzip、zstd、snappy)日志输出目标(文件、网络、控制台)
通过接口抽象,调用方只依赖行为定义,不关心具体实现,系统更灵活,也更容易做单元测试。
基本上就这些。Go没有继承,但通过接口和组合,能非常自然地实现策略模式,写出清晰、可扩展的代码。
以上就是Golang如何使用策略模式实现可插拔算法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1120578.html
微信扫一扫
支付宝扫一扫