迭代器模式#
迭代器模式是一种行为设计模式,能够让我们在**不暴露数据结构底层表现形式(树、栈、列表等)**等情况下,遍历所有集合中的所有元素。
问题引入#
集合,是常用的数据结构之一,其实际组成就是一系列的对象,存储在一起。可以通过树、栈、图等其他的复杂的数据结构。
遍历集合中的元素。如果集合内部是使用列表进行存储,那么遍历元素就会显得非常直接和简单。但如果是复杂的数据结构呢(树、图)?你可以使用深度优先遍历,也可以使用广度优先遍历,或者随机遍历等等方法。这就会徒增系统的复杂性。
况且对客户端来说,可能他并不关心集合内部的具体组成部分,但是我们必须得提供集合的不同的访问方式,所以代码就会出现和遍历方式的耦合。
问题解决#
将集合的遍历行为抽取为单独的迭代器对象。
整体结构#
代码示例#
使用go实现迭代器
type Collection interface {
createIterator() Iterator
}
type Iterator interface {
HasNext() bool
Next() User
}
type User struct {
name string
}
type UserIterator struct {
index int
users []User
}
type UserCollection struct {
iterator UserIterator
}
func (i *UserIterator) HasNext() bool {
if i.index > len(i.users) {
return false
}
return true
}
func (i *UserIterator) Next() User {
if i.HasNext() {
user := i.users[i.index]
i.index += 1
return user
}
return User{}
}
go应用总结#
- 可对客户端隐藏集合背后复杂的数据结构
- 可减少程序中重复的遍历代码
- 可让代码支持遍历不同的甚至无法预知的数据结构
- 在很多编程语言中都原生支持
Iterator
Rust、Cpp等