美文网首页
设计模式——迭代器模式

设计模式——迭代器模式

作者: spfi | 来源:发表于2018-09-15 15:07 被阅读0次

    1、迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素, 而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。
    2、实现自己的迭代器-内部迭代器
    现在我们来自己实现一个 each 函数,each 函数接受 2 个参数,第一个为被循环的数组,第
    二个为循环中的每一步后将被触发的回调函数:
    var each = function( ary, callback ){
    for ( var i = 0, l = ary.length; i < l; i++ ){
    callback.call( ary[i], i, ary[ i ] ); // 把下标和元素当作参数传给 callback 函数
    }
    };

    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 不相等' );
    }
    });
    alert ( 'ary1 和 ary2 相等' );
    };

    compare( [ 1, 2, 3 ], [ 1, 2, 4 ] ); // throw new Error ( 'ary1 和 ary2 不相等' );
    3、外部迭代器
    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 
    } 
    

    };

    再看看如何改写 compare 函数:
    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 相等
    4、倒序迭代器
    var reverseEach = function( ary, callback ){
    for ( var l = ary.length - 1; l >= 0; l-- ){
    callback( l, ary[ l ] );
    }
    };

    reverseEach( [ 0, 1, 2 ], function( i, n ){
    console.log( n ); // 分别输出:2, 1 ,0
    });
    5、迭代器应用
    var getUploadObj = function(){
    try{
    return new ActiveXObject("TXFTNActiveX.FTNUpload"); // IE 上传控件
    }catch(e){
    if ( supportFlash() ){ // supportFlash 函数未提供
    var str = '<object type="application/x-shockwave-flash"></object>';
    return ( str ).appendTo(('body') );
    }else{
    var str = '<input name="file" type="file"/>'; // 表单上传
    return ( str ).appendTo(('body') );
    }
    }
    };
    var getActiveUploadObj = function(){
    try{
    return new ActiveXObject( "TXFTNActiveX.FTNUpload" ); // IE 上传控件
    }catch(e){
    return false;
    }
    };

    var getFlashUploadObj = function(){
    if ( supportFlash() ){ // supportFlash 函数未提供
    var str = '<object type="application/x-shockwave-flash"></object>';
    return ( str ).appendTo(('body') );
    }
    return false;
    };

    var getFormUpladObj = function(){
    var str = '<input name="file" type="file" class="ui-file"/>'; // 表单上传
    return ( str ).appendTo(('body') );
    };
    迭代器代码如下:
    var iteratorUploadObj = function(){
    for ( var i = 0, fn; fn = arguments[ i++ ]; ){
    var uploadObj = fn();
    if ( uploadObj !== false ){
    return uploadObj;
    }
    }
    };

    相关文章

      网友评论

          本文标题:设计模式——迭代器模式

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