当前位置:   article > 正文

Golang与设计模式-Iterator迭代器模式_golang iteration

golang iteration

迭代器模式在Java和C#中常用到的行为型设计模式,这种模式主要用于对于集合(Aggregate)的有序访问。

一般情况下Golang的开发中是不需要使用到的,像Slice跟Array都可以通过for...range...来完成遍历。但不是说一定就用不上哦。

场景

我有一个书架(BookShelf),书架内摆放了很多书籍(Book),我想要不直接暴露BookShelf内部数据的情况下,获取书架上所有的书籍信息。

如果应用上迭代器模式我们该如何实现呢?

很简单,当我们想要获取所有书籍信息时,直接获取BookShelf的迭代器(Iterator),我们通过对迭代器的方法Next()调用来遍历获取书籍信息。迭代器的职责就是遍历数据集合的。

接口

首先,我们知道迭代器模式主要适用于数据集合,那么我们就可以定义一个集合(Aggregate)接口,这个接口只有一个方法,就是返回给我们一个迭代器(Iterator)。

  1. // 集合接口
  2. type Aggregate interface {
  3. // 返回一个迭代器
  4. GetIterator() Iterator
  5. }

然后,我们还需要一个定义一个迭代器(Iterator)接口,这个接口有两个方法,分别是 HasNext()bool,判断是否还有值;Next()interface{},返回下一个值。

  1. // 迭代器接口
  2. type Iterator interface {
  3. // 判断是否还有值
  4. HasNext() bool
  5. // 取下一个值
  6. Next() interface{}
  7. }

实现

接下来我们还需要定义一个Book结构体,并分别定于实现了Aggregate接口书架类型BookShelf,以及实现了 Iterator接口的 BookShelfIterator

  1. // 书
  2. type Book struct {
  3. // 名字
  4. Name string
  5. // 作者
  6. Author string
  7. }

Book只有两个string类型字段,书名Name,作者Author。

  1. // 书架,一个存放书籍的集合
  2. type BookShelf struct {
  3. books []Book
  4. }
  5. // 书架实现集合接口
  6. func (bs *BookShelf) GetIterator() Iterator {
  7. // 每次都会创建一个新的迭代器,从 index=0 位置开始遍历
  8. return &BookShelfIterator{bookShelf: bs}
  9. }

书架BookShelf中有一个书的集合Books。并且实现了集合(Aggregate)接口的 返回迭代器Iterator的方法。

  1. // 书架迭代器
  2. type BookShelfIterator struct {
  3. // 当前遍历位置
  4. index int
  5. // 所指向书架
  6. bookShelf *BookShelf
  7. }
  8. // 书架迭代器实现迭代器接口
  9. func (i *BookShelfIterator) HasNext() bool {
  10. return i.index < len(i.bookShelf.books)
  11. }
  12. // 书架迭代器实现迭代器接口
  13. func (i *BookShelfIterator) Next() interface{} {
  14. book := i.bookShelf.books[i.index]
  15. i.index++
  16. return book
  17. }

书架迭代器BookShelfIterator实现 Iterator接口的两个方法。

测试

接下来我们测试一下代码:

  1. func main() {
  2. // 声明一个书架对象,并添加一些书籍
  3. bookShelf := &BookShelf{
  4. books: []Book{
  5. {Name: "以太坊技术详解与实战", Author: "闫莺,郑恺,郭众鑫"},
  6. {Name: "大话代码架构", Author: "田伟,郎小娇"},
  7. {Name: "GO语言公链开发实战", Author: "郑东旭,杨明珠,潘盈瑜,翟萌"},
  8. {Name: "区块链原理、设计与应用", Author: "杨保华,陈昌"},
  9. {Name: "精通区块链智能合约开发", Author: "熊丽兵"},
  10. {Name: "C程序设计", Author: "谭浩强"},
  11. },
  12. }
  13. // 获取书架的迭代器
  14. iterator := bookShelf.GetIterator()
  15. // 遍历,直到没有下一本书(HasNext == flase)
  16. for iterator.HasNext() {
  17. book := iterator.Next().(Book)
  18. fmt.Printf("书名:%s, 作者:%s \n", book.Name, book.Author)
  19. }
  20. }

运行结果:

代码已上传Github:LyonNee/design_patterns_with_go: 基于Golang实现的设计模式代码 (github.com)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/507430
推荐阅读
相关标签
  

闽ICP备14008679号