返回首页
一、概述
Iterator属于行为型模式中的一种,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
二、适用性
1. 访问一个聚合对象的内容而无需暴露它的内部表示。
2. 支持对聚合对象的多种遍历。
3. 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。
三、参与者
1. Iterator:迭代器定义访问和遍历元素的接口。
2. ConcreteIterator:具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
3. Aggregate:聚合定义创建相应迭代器对象的接口。
4. ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
四、类图
五、代码实现
1. Iterator:迭代器定义访问和遍历元素的接口。
Iterator.swift
import Foundation
/// 迭代器定义访问和遍历元素的接口
protocol Iterator {
/** 下一个*/
func next() ->AnyObject
/** 第一个*/
func first()
/** 最后一个*/
func last()
/** 是否有下一个*/
func hasNext() ->Bool
}
2. ConcreteIterator:具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
IteratorImpl.swift
import Foundation
/// 具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置
class IteratorImpl: Iterator {
/// 数组
private var list:List
/// 位置
private var index:Int
init(list:List) {
self.index = 0
self.list = list
}
func first() {
self.index = 0
}
func last() {
self.index = self.list.getSize()
}
func next() -> AnyObject {
let obj:AnyObject = self.list.get(index)
self.index += 1
return obj
}
func hasNext() -> Bool {
return self.index < self.list.getSize()
}
}
3. Aggregate:聚合定义创建相应迭代器对象的接口。
List.swift
import Foundation
/// 聚合定义创建相应迭代器对象的接口
protocol List {
func iterator() ->Iterator
func get(index:Int) ->AnyObject
func getSize() ->Int
func add(obj:AnyObject)
}
4. ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
ListImpl.swift
import Foundation
/// 具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.
class ListImpl: List {
/// 数组
private var list:[AnyObject] = []
/// 位置
private var index:Int = 0
/// 长度
private var size:Int = 0
func iterator() ->Iterator {
return IteratorImpl(list: self)
}
func get(index:Int) ->AnyObject {
return list[index]
}
func getSize() ->Int {
return size
}
func add(obj:AnyObject) {
list.append(obj)
index += 1
size += 1
}
}
六、测试
1. 代码
// 迭代器模式
let list:List = ListImpl()
list.add("a")
list.add("b")
list.add("c")
//第一种迭代方式
let it = list.iterator();
while (it.hasNext()) {
println(it.next())
}
println("===========")
//第二种迭代方式
for (var i = 0; i < list.getSize(); i++) {
println(list.get(i));
}<span style="font-size:14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
2. 运行结果
a
b
c
===========
a
b
c