迭代器模式指提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露对象的内部。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式后,即使不关心内部构造,也可以按顺序访问其他的每个元素。
jquery中的迭代器
迭代器模式无非就是循环访问聚合对象中的各个元素。比如jquery
中的each函数。
$.each([1,3,4], function(i, n){
console.log('当前下标为: '+i)
console.log('当前值为: '+i)
})
内部迭代器
jquery的each其实属于内部迭代器,函数内部定义好了迭代规则,外部只需要一次初始调用即可。
缺点:
由于内部迭代器的迭代规则已经写好,所以无法迭代多个
var each = function(ary, callback){
for(let i = 0, l=ary.length; i<l;i++) {
callback.call(ary[i], i, ary[i])
}
}
each([1,2,3], function(i, n){
alert([i,n])
})
假如现在有个需求,要判断2个数组里的值是否完全相等,如果不改写each里的代码,那么入手的就只能是each的回调函数了
var each = function(ary, callback){
for(let i = 0, l=ary.length; i<l;i++) {
callback.call(ary[i], i, ary[i])
}
}
each([1,2,3], function(i, n){
alert([i,n])
})
var compare = function(ary1, ary2) {
if(ary1.length !== ary2.length) {
throw new Error('ary1和ary2不相等')
}
each(ary1, function(i, n){
if(n !== ary2[i]){
throw new Error('ary1和ary2不相等')
}
})
alear('ary1和ary2相等')
}
compare([1,2,3],[1,3,4]) //throw new Error('ary1和ary2不相等')
外部迭代器
外部迭代器必须显示的请求迭代下一个元素
优点:
增强了迭代器的灵活性,可以手工控制迭代的过程或者顺序
缺点:
增加了调用的复杂度
下面用外部迭代器改写上面那个需求
var Iterator = function(obj){
var current = 0
var next = function(){
current += 1
}
var isDone = function(){
return current >= obj.length
}
var getCurrItem = function(){
return obj[current]
}
return {
next,
isDone,
getCurrItem
}
}
var compare = function(iterator1, iterator2) {
while(!iterator1.isDone() && !iterator2.isDone()) {
if(iterator1.getCurrItem() !== iterator2.getCurrItem()){
throw new Error('iterator1和iterator2不相等')
}
iterator1.next()
iterator2.next()
}
alert('iterator1和iterator2不相等')
}
var iterator1 = Iterator([1,2,3])
var iterator2 = Iterator([2,2,3])
compare(iterator1, iterator2) //throw new Error('iterator1和iterator2不相等')
中止迭代器
迭代器可以像普通for循环中的break一样,提供出一种跳出循环的方法
var each = function(ary, callback){
for(let i = 0, l=ary.length; i<l;i++) {
// 如果回调函数返回false,则中止循环
if(callback(i, ary[i]) === false) {
break
}
}
}
each([1,2,3,4], function(i, n){
if(n>3){
return false
}
console.log(n) //输出1,2,3
})
总结
迭代器模式是一种相对简单的模式,简单到很多时候我们都不认为它是一种设计模式。目前绝大部分都内置了迭代器
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。