17.Golang设计模式之迭代器模式

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

迭代器模式

GitHub代码链接
迭代器模式(Iterator Pattern)是JAVA和.NET中常用的模式,这种模式用于顺序访问集合中的元素。

什么是迭代器模式

迭代器提供一种方法顺序访问一个对象各个元素,而无需暴露对象的内部表示。

迭代器模式解决了什么问题

不同的方式遍历整个集合,把在元素之间游走的责任交给迭代器,而不是集合对象。

优点

  • 它支持不同的方式遍历集合对象
  • 迭代器简化了聚合类
  • 在同一个聚合上面可以有多个遍历
  • 迭代器模式中,新增聚合类和迭代器都很方便,无需新增代码

缺点

  • 迭代器模式将存储数据和遍历数据职责分离,增加新的聚合类,对应要增加新的迭代器,类的个数成对增加,在一定程度上增加了系统的复杂性。

代码实现

我们使用Go语言匿名函数的功能。来返回一个迭代器。

1.带迭代器的类

//NameRepository 姓名仓库
type NameRepository struct {
    Names []string
}

//NewNameRepository 实例化姓名仓库
func NewNameRepository() *NameRepository {
    return &NameRepository{
        Names: make([]string, 0),
    }
}

//GetIterator 获取姓名仓库的迭代器
func (nr *NameRepository) GetIterator() func() (string, bool) {
    index := 0
    return func() (name string, ok bool) {
        if index >= len(nr.Names) {
            return
        }
        name, ok = nr.Names[index], true
        index++
        return
    }
}

//SetName 向姓名仓库添加名字
func (nr *NameRepository) SetName(name string) {
    nr.Names = append(nr.Names, name)
}

2.测试

func GetIteratorTest(t *testing.T) {
    nameRepository := NewNameRepository()
    nameRepository.SetName("Jay")
    nameRepository.SetName("JJ")
    nameRepository.SetName("Bob")
    nameRepository.SetName("Mary")

    it := nameRepository.GetIterator()
    for {
        name, ok := it()
        if !ok {
            break
        }
        fmt.Println("Get name: ", name)
    }
}

上一篇

16.Golang设计模式之解释器模式

下一篇


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

本文来自:简书

感谢作者:ShawnLee_123

查看原文:17.Golang设计模式之迭代器模式

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

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