迭代器模式
定义
**迭代器模式**(Iterator)
:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
为不同的聚集结构提供第一项、下一个、是否结束、当前项等统一接口;
UML图
基本实现代码
Aggregate
:抽象聚集类
abstract class Aggregate {
abstract fun createIterator(): Iterator
}
ConcreteAggregate
:具体聚集类
class ConcreteAggregate : Aggregate() {
private val items = arrayListOf<Any>()
override fun createIterator(): Iterator {
return ConcreteIterator(this)
}
fun count() = items.size
fun get(index: Int) = items.getOrNull(index)
fun set(index: Int, obj: Any) = items.set(index, obj)
fun addAll(arrays: List<Any>) {
items.addAll(arrays)
}
}
Iterator
:抽象迭代器类
abstract class Iterator {
abstract fun first(): Any?
abstract fun next(): Any?
abstract fun isDone(): Boolean
abstract fun currentItem(): Any?
}
ConcreteIterator
:具体迭代器类
class ConcreteIterator(val aggregate: ConcreteAggregate) : Iterator() {
private var currentIndex = 0//指针,记录迭代到哪个位置
override fun first(): Any? {
return aggregate.get(0)
}
override fun next(): Any? {
currentIndex++
var tempObj: Any? = null
if (currentIndex < aggregate.count()) {
tempObj = aggregate.get(currentIndex)
}
return tempObj
}
override fun isDone(): Boolean {
return currentIndex >= aggregate.count()
}
override fun currentItem(): Any? {
return aggregate.get(currentIndex)
}
}
Client
:客户端
--->a
--->b
--->c
--->d
--->e
--->f
迭代器模式的优缺点
- 优点:
- 分离集合对象的遍历行为,抽出一个迭代器来负责,这样可以不暴露集合内部结构,又可以让外部代码透明底访问集合内部数据。
- 应用:
- 当需要对聚集提供多种方式遍历时(正向、反向遍历)
- Java中的foreach