前言
迭代器模式又称为游标模式
,是行为型
设计模式;
定义:
提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示;
使用场景:
遍历一个容器对象时;
UML类图:
Iterator:
迭代器接口,负责定义、访问和遍历元素的接口;
ConcreteIterator:
具体迭代器类,实现迭代器接口,并记录遍历的当前位置;
Aggregate:
容器接口,负责提供创建具体迭代器角色;
ConcreteAggregate:
具体容器类;
模板代码
Iterator
/**
* 迭代器接口
*/
interface Iterator<T> {
/**
* 是否还有下一个元素
*/
fun hasNext(): Boolean
/**
* 返回当前位置的元素并将位置移至下一位
*/
fun next(): T?
}
ConcreteIterator
/**
* 具体迭代器类
*/
class ConcreteIterator<T>(private val list: ArrayList<T>) : Iterator<T> {
private var cursor = 0 //当前位置
override fun hasNext(): Boolean {
return cursor != list.size
}
override fun next(): T? {
var obj: T? = null
if (hasNext()) {
obj = list[cursor++]
}
return obj
}
}
Aggregate
/**
* 容器接口
*/
interface Aggregate<T> {
/**
* 添加元素
*/
fun add(obj: T)
/**
* 移除元素
*/
fun remove(obj: T)
/**
* 获取容器的迭代器
*/
fun iterator(): Iterator<T>
}
ConcreteAggregate
/**
* 具体的容器类
*/
class ConcreteAggregate<T> : Aggregate<T> {
private val list = arrayListOf<T>()
override fun add(obj: T) {
list.add(obj)
}
override fun remove(obj: T) {
list.remove(obj)
}
override fun iterator(): Iterator<T> {
return ConcreteIterator(list)
}
}
- 代码使用
object Test {
@JvmStatic
fun main(args: Array<String>) {
val concreteAggregate = ConcreteAggregate<String>()
concreteAggregate.add("1")
concreteAggregate.add("2")
concreteAggregate.add("3")
concreteAggregate.add("4")
val iterator = concreteAggregate.iterator()
while (iterator.hasNext()){
println(iterator.next()) //结果输出 1 2 3 4
}
}
}
Android源码中的迭代器模式
各种list、map集合
数据库数据查询Cursor
总结
迭代器模式发展至今,几乎每一种高级语言都已经内置实现,极少需要自己去实现迭代器;
优点:
支持以不同的方式去遍历一个容器对象,也可以有多个遍历,弱化了容器类与遍历算法之间的关系;
缺点:
类文件的增加;
结语
如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )