美文网首页
迭代器模式

迭代器模式

作者: JohnSmith | 来源:发表于2015-06-10 01:05 被阅读49次

定義

提供一種方法順序訪問一個聚合對象中的每個元素,而又不需要暴露該對象的內部表示。

要點

  • 迭代器模式可以把迭代的過程從業務邏輯中分離出來。
  • 迭代器可以分為內部迭代器和外部迭代器。
  • 內部迭代器已經定義好了迭代規則,它完全接手整個迭代過程,外部只需要一次初始調用。
  • 外部迭代器必須顯示地請求迭代下一個元素。它增加了一些調用的複雜度,但相對也增強了迭代器的靈活性。
  • 從一般迭代器的實現中可以看出,只要被迭代的聚合對象擁有 length 屬性而且可以用下標訪問元素,那它就可以被迭代。
  • JavaScript中,for in 語句可以迭代普通字面量對象的屬性。jQuery 中的 $.each 函數封裝了類數組對象和字面量對象的迭代行為。
  • 中止迭代器:$.each 是約定如果回調函數的執行結果返回 false,則提前中止循環。
  • 迭代器的應用場景之一是在某些情況下取代函數中的多個 if else 條件分支。

核心代碼

\\ 內部迭代器
var each = function(arr, callback) {
    for (var i = 0, l = arr.length; i < l; i++) {
        if (callback(i, arr[i]) === false) {
            break;
        }
    }
};

each([1, 2, 3], function(i, n) {
    // callback function
});
\\ 外部迭代器
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: next,
        isDone: isDone,
        getCurrItem: getCurrItem
    };
};

\\ 應用外部迭代器
var compare = function(iterator1, iterator2) {
    while(!iterator1.isDone() && !iterator2.isDone()) {
        if (iterator1.getCurrItem() !== iterator2.getCurrItem()) {
            console.log('Not Equal.');
            return;
        }
        iterator1.next();
        iterator2.next();
    }
    console.log('Equal.');
};

var iterator1 = Iterator([1, 2, 3]);
var iterator2 = Iterator([1, 2, 3]);
compare(iterator1, iterator2);

相关文章

网友评论

      本文标题:迭代器模式

      本文链接:https://www.haomeiwen.com/subject/owljqttx.html