迭代器模式指提供一种方法顺序访问一个聚合对象中的各个元素,而不须要暴露对象的内部。迭代器模式能够把迭代的过程从业务逻辑中分离出来,在使用迭代器模式后,即便不关心内部构造,也能够按顺序访问其余的每一个元素。
迭代器模式无非就是循环访问聚合对象中的各个元素。好比jquery
中的each函数。jquery
$.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不相等')
外部迭代器必须显示的请求迭代下一个元素 设计
优势:
加强了迭代器的灵活性,能够手工控制迭代的过程或者顺序 code
缺点:
增长了调用的复杂度对象
下面用外部迭代器改写上面那个需求get
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 })
迭代器模式是一种相对简单的模式,简单到不少时候咱们都不认为它是一种设计模式。目前绝大部分都内置了迭代器it