迭代器模式的定义
迭代器模式的使用场景
迭代器模式的优缺点
迭代器模式的实现
这里将从以上几个方面记录迭代器模式
- 迭代器模式的定义:
其实迭代器模式的定义时很简单的,它就是提供一种循序访问一个聚合对象内的各个元素,但又无需暴露对象内部的表示。这里注意的是迭代的对象需要是一个有序的对象集合,而我们常用的object则不满足这个条件,常见的可迭代对象如:Array, Map, Set, String, arguments, NodeList等等 - 迭代器模式的使用场景:
迭代器模式其实也就是顺序遍历一个有序对象集合,使用的场景:1.当访问某个对象而不需暴露它的内部表现是可以选择迭代器模式。2. 为遍历不同类型的集合对象提供一个统一的遍历接口可以选择迭代器模式实现 - 迭代器模式的优缺点:
优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。 - 迭代器模式的实现:
- 首先以传统的es6语法实现迭代器模式:
// 定义一个迭代器对象:
class Iterater{
constructor(container){
this.list = container.list
this.index = 0
}
// 获取聚合对象的元素的方法
next(){
if(this.hasNext()){
return this.list[this.index++]
}
return null
}
// 判断是否还有下一个元素:及用于判断是否遍历结束
hasNext(){
if(this.index >= this.list.length){
return false
}
return true
}
}
// 定义一个可获取迭代器的封装类
class Container{
constructor(list){
this.list = list
}
// 获取迭代器方法
getIterater(){
return new Iterater(this)
}
}
// 测试:
let arr = ['数据1', '数据2', '数据3']
let container = new Container(arr)
let iterater = container.getIterater()
while(iterater.hasNext()){
console.log(iterater.next())
}
- 这里简单说一下Es6中的Iterater:
Es6中的每一个有序聚合对象都有一个[Symbol.iterater], 这是一个方法,可以用于获取到当前对象的迭代器Iterater, 我们可以通过Array数组对象进行查看:
Array.prototype[Symbol.iterater]
Array.prototype[Symbol.iterater]()
Array.prototype[Symbol.iterater]().next()
可以得到如下结果显示:
这里就再以这种方式通过Iterater定义一个公用的迭代方法:
/**
* 迭代有序聚合对象
* @param {Array} list 被迭代的对象
* @param {Function} callback 回调函数
*/
function each(list, callback){
let iterater = list[Symbol.iterater]()
let item = {done: false}
while(!item.done){
item = iterater.next()
if(!item,done){
callback(item.value)
}
}
}
可能很多人不清楚这个实现方法,而且也很少用到,但是我们经常会用到的是 for … of … 的语法,而这个语法的实现也是Iterater迭代器的,所以for … of … 语法在使用时需要迭代的对象是一个有序的聚合对象,Object则不能使用该语法。
关于迭代器模式就记录到这里了 大家 加油!!!