美文网首页
迭代器模式

迭代器模式

作者: 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