Iterator Mode 迭代器模式
The idea of the iterator is to extract the traversal behavior into an independent iterator object. The collection has some elements, and we use the iterator to get each element step by step.
迭代器的主要思想是将遍历行为抽取为单独的迭代器对象。
集合里有一些元素,使用关于集合的迭代器一步接一步地访问每个元素。
如下代码,集合使用数组实现,有正向和反向两种迭代器可以使用。迭代器的调用是统一的格式,判断有没有下一个,若有则访问,若无则结束;选择了不同的迭代器,则迭代效果不同。
// Element in the collection
class Node {
var info: String = ""
init(_ s: String) {
self.info = s
}
}
// Iterator
protocol Iterator {
func hasNext() -> Bool
func getNext() -> Node
}
// Concrete iterator
class PositiveIterator: Iterator {
var collection: Collection
var curIndex = 0
init(_ c: Collection) {
self.collection = c
}
func hasNext() -> Bool {
if curIndex < collection.nodes.count {
return true
} else {
return false
}
}
func getNext() -> Node {
var node = collection.nodes[curIndex]
curIndex += 1
return node
}
}
// Concrete iterator
class RevertIerator: Iterator {
var collection: Collection
var curIndex = 0
init(_ c: Collection) {
self.collection = c
self.curIndex = collection.nodes.count - 1
}
func hasNext() -> Bool {
if curIndex >= 0{
return true
} else {
return false
}
}
func getNext() -> Node {
var node = collection.nodes[curIndex]
curIndex -= 1
return node
}
}
// Collection
protocol Collection {
var nodes: [Node] { get set }
func getIterator() -> Iterator
func getRevertIterator() -> Iterator
}
// Concrete collecton
class NodesCollection: Collection {
var nodes: [Node]
init() {
self.nodes = []
}
func append(_ n: Node) {
nodes.append(n)
}
func getIterator() -> Iterator {
return PositiveIterator(self)
}
func getRevertIterator() -> Iterator {
return RevertIerator(self)
}
}
let str = "hello world"
let collection = NodesCollection()
for s in str {
collection.append(Node(String(s)))
}
var it = collection.getIterator()
while (it.hasNext()) {
var n = it.getNext()
print(n.info, terminator: " ")
}
print()
it = collection.getRevertIterator()
while (it.hasNext()) {
var n = it.getNext()
print(n.info, terminator: "_")
}
collection 依赖于 iterator,在有需要的时候通过集合得到能遍历集合的迭代器入口,一个迭代器使用一次,然后访问下一个,如此重复操作,直到迭代器为空。所以是使用迭代器对集合进行遍历,每次访问到的是 node ,是具体的数据元素。