迭代器模式

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)
    }
}
上一篇 下一篇