golang 策略模式之排序算法策略

木申 · · 309 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

起源

最近在学设计模式,这个东西学起来,总是模模糊糊,看起来懂,又不知该应用到何处,咬着牙学完了之后,准备学习算法,写了两个简单的排序算法,突然灵光一闪,如果我想用不用的算法去排序的时候,完全可以用策略模式,正好学以致用

示例

我先设计了一个排序接口

type sortAlgo interface {
 sort([]int)
}

然后,我写了两个算法,一个是冒泡排序,一个是简单选择排序,都实现了这个接口

type bubbleSort struct {
}
func (b *bubbleSort) sort(data []int) {
    n := len(data)
    for i:=0; i<n-1; i++ {
    for j:=n-1; j>i; j-- {
        if data[j-1] > data[j] {
            tmp := data[j-1]
            data[j-1] = data[j]
            data[j] = tmp
       }
 } }}
 
 type simpleSelectSort struct {
}
func (s *simpleSelectSort) sort(data []int) {
    n := len(data)
   for i:=0; i<n; i++ {
      minIndex := i
      for j:=i+1; j<n; j++ {
          if data[j] < data[minIndex] {
            minIndex = j
          }
 } if minIndex != i {
     tmp := data[minIndex]
     data[minIndex] = data[i]
     data[i] = tmp
  }
 }}

最后,我构建一个策略模式,可以通过设计,决定使用哪一个算法

type sortStrategy struct {
 data []int
 sortAlgo
}
func (s *sortStrategy) setAlgo(sa sortAlgo) {
 s.sortAlgo = sa
}
func (s *sortStrategy) setData(data []int) {
 s.data = data
}
func (s *sortStrategy) run() {
 s.sortAlgo.sort(s.data)
}

总结

说实话,这么写有点Java了,但是我看的设计模式的书,就是基于Java的,先学习思想嘛
我脑海中,现在还蹦出来另一个思路,排序时,接收一个排序方法,再调用

type sortFunc func([]int)

这样是不是更gopher了呢


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:木申

查看原文:golang 策略模式之排序算法策略

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

309 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传