251108 thinking iterator
1. 什么是迭代器模式
迭代器模式(Iterator Pattern)是一种行为设计模式,它提供一种方法来顺序访问一个聚合对象(Aggregate Object)中的各个元素,而又无需暴露该对象的内部表示。
无论操作的是一个数组、一个链表、一棵树还是一个哈希表,都可以用同样的客户端方式去遍历它(比如一个 for-each 循环),而不关心底层的具体的遍历方式是dfs还是bf或者其他。
它将遍历的逻辑从聚合对象中分离出来,放入一个单独的迭代器对象中。这样,容器只负责存储数据,而迭代器负责遍历数据。
2. 为什么需要迭代器模式?
如果没有迭代器模式,客户端代码需要知道聚合对象的内部结构才能进行遍历。例如,遍历数组需要用索引,遍历链表需要用 next 指针。这会导致客户端与数据结构紧密耦合。
- 客户端无需关心容器的内部实现(是
slice、map还是linked list),使得更换或修改容器实现变得容易,不影响客户端代码。 - 为不同的数据结构提供了统一的遍历方式,简化了客户端代码。
- 可以为同一个聚合对象提供多种不同的迭代器(如正向遍历、反向遍历)。
- 符合单一职责原则:聚合对象专注于数据存储,而迭代器专注于遍历,职责清晰。
Go 语言的 for...range 循环就是迭代器模式的一个典型应用,它为数组、切片、字符串、map 和 channel 提供了统一的遍历语法。
3. 迭代器模式的实现 (Go)
对一个二叉树实现迭代器模式,要求迭代器能够按中序遍历二叉树。
1 | // Iterator 是泛型迭代器接口 |
1 | // InOrderIterator 是具体迭代器类 |
1 | func main() { |
类图:
classDiagram
class Iterator {
<<interface>>
+IsEnd() bool
+GetCur() E
}
class Collection {
<<interface>>
+CreateIterator() Iterator[E]
}
class TreeNode {
+Val T
+Left *TreeNode[T]
+Right *TreeNode[T]
}
class BinaryTree {
+Root *TreeNode[T]
}
class InOrderIterator {
-stack []*TreeNode[T]
-pushLeft(node *TreeNode[T])
+IsEnd() bool
+GetCur() *TreeNode[T]+
}
Iterator <|.. InOrderIterator
Collection <|.. BinaryTree
TreeNode "1" <--* "*" BinaryTree : node
Collection ..> Iterator : Creates
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elian's blog page!