XingPiaoLiang's

Back

迭代器模式#

迭代器模式是一种行为设计模式,能够让我们在**不暴露数据结构底层表现形式(树、栈、列表等)**等情况下,遍历所有集合中的所有元素。

问题引入#

集合,是常用的数据结构之一,其实际组成就是一系列的对象,存储在一起。可以通过树、栈、图等其他的复杂的数据结构。

遍历集合中的元素。如果集合内部是使用列表进行存储,那么遍历元素就会显得非常直接和简单。但如果是复杂的数据结构呢(树、图)?你可以使用深度优先遍历,也可以使用广度优先遍历,或者随机遍历等等方法。这就会徒增系统的复杂性。

况且对客户端来说,可能他并不关心集合内部的具体组成部分,但是我们必须得提供集合的不同的访问方式,所以代码就会出现和遍历方式的耦合。

问题解决#

将集合的遍历行为抽取为单独的迭代器对象。

整体结构#

代码示例#

使用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等
设计模式-行为型-迭代器
https://astro-pure.js.org/blog/iterator
Author erasernoob
Published at June 4, 2025
Comment seems to stuck. Try to refresh?✨