设计模式之迭代器模式

Posted by franki on November 5, 2018

iterator

迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示

迭代器模式可以把迭代过程中从业务逻辑分离出来,从而不用关心对象的内部构造,也可以按照顺序访问其中的每个元素。

实现自己的each函数,each函数接收两个参数,一个是被循环的数组,第二个是循环中的每一步后将被触发的回调函数。

//内部迭代器
var each = function(ary, callback) {
    for(var i=0, l=ary.length;i<l;i++){
        callback(ary[i],i,ary[i]);
    }
}

each([1,2,3], function(i,n){
    console.log(i, n);
})

迭代器分为内部迭代器和外部迭代器,如上的例子属于内部迭代器,即是不关心内部实现,已经规定了规则,只需要一次性初始调用。这也带来了一个缺点,就是无法同时遍历两个数组。

外部迭代器 必须显式地请求迭代下一个元素。 这样一来,增加了一些调用的复杂度,但相对也增强了迭代器的灵活性,我们可以手工控制迭代过程或顺序

var Iterator = funciton(obj) {
    var current = 0;

    var next = function() {
        current += 1;
    }

    var isDone = function() {
        return current > obj.length;
    }

    var getCurrItem = function() {
        return obj[current];
    }

    return {
        next: next,
        isDone: isDone,
        getCurrItem: 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([1,2,3]);

compare(iterator1, iterator2);// 输出: iterator1 和 iterator2 相等

外部迭代器虽然调用方式相对复杂,但它的适用面更广,也能满足更多变的需求。 内部迭代器和外部迭代器在实际生产中没有优劣之分,究竟使用哪个要根据需求场景而定。