JavaScript设计模式_04_迭代器模式

迭代器模式属于一种比较简单的设计模式,许多开发语言都内置了迭代器。这里要说的是迭代器分为内部迭代器和外部迭代器,它们都有各自的适用场景。

/* pre:迭代器模式
 * 迭代器模式提供了一种顺序访问聚合元素内部对象的方法,而又不需要暴露对象内部的表示。
 */
//-------- 示例1 --------
/**
 * 内部迭代器:内部函数已经定义好迭代的规则,外部只需一次初始化调用。
 * 这里手动实现each遍历函数。
 */
var each = function(arr, callback) {
    for(var i = arr.length - 1; i >= 0; i--) {
        callback.call(arr[i], i, arr[i]);
    }
};

each([1, 2, 3], function() {
    console.log("参数结果:" + Array.prototype.join.call(arguments, ","));
});

//------------ 示例2 ------------
/**
 * 外部迭代器:必须显示地迭代下一个元素。外部迭代器增加了调用的复杂度,但相对地增强了迭代器的灵活性。
 */
var iterator = function(obj) {
    var current = 0;
    var next = function() {
        current += 1;
    };
    var isDone = function() {
        return current >= obj.length;
    };
    var getCurrentItem = function() {
        return obj[current];
    };
    return {
        next: next,
        isDone: isDone,
        getCurrentItem: getCurrentItem
    }
};
var compare = function(iter1, iter2) {
    while(!iter1.isDone() && !iter2.isDone()) {
        if(iter1.getCurrentItem() != iter2.getCurrentItem()) {
            throw new Error("两个数组不相同;");
        }
        iter1.next();
        iter2.next();
    }
    console.log("两个数组相同。");
};
compare(iterator([1, 2, 3]), iterator([1, 2, 3]));
/**
 * 内部迭代器和外部迭代器各有优缺点,使用时还需要根据具体场景,灵活应用。
 */
posted @ 2017-06-12 17:37  Stinchan  阅读(185)  评论(0编辑  收藏  举报