美文网首页
JavaScript 设计模式(中)——4.迭代器模式

JavaScript 设计模式(中)——4.迭代器模式

作者: Haleng | 来源:发表于2019-12-21 14:44 被阅读0次

    4 迭代器模式

    迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。

    4.1 each 函数

    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 ] );
    });
    

    4.2 内部迭代器和外部迭代器

    • 内部迭代器:外界不用关心迭代器内部的实现,跟迭代器的交互也仅仅是一次初始调用,如 each 函数;
    • 外部迭代器:必须显式地请求迭代下一个元素;增加了一些调用的复杂度,但相对也增强了迭代器的灵活性,可以手工控制迭代的过程或者顺序;

    实现判断 2 个数组里元素的值是否完全相等

    // 1. 内部迭代器实现
    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 不相等' );
    
    // 2.外部迭代器实现
    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() ){
          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.3 迭代器模式的应用举例

    文件上传模块中,根据不同的浏览器获取相应的上传组件对象:

    // 1. 最初代码,使用 if-else 一个个进行判断
    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') );
        }
      }
    };
    // 2. 迭代器:每种获取 upload 对象的方法都封装在各自的函数,使用一个迭代器,迭代获取这些 upload 对象,直到获取到一个可用的为止;每种 upload 对象约定若该函数里面的 upload 对象是可用的,则让函数返回该对象,反之返回 false,提示迭代器继续往后面进行迭代;
    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;
        }
      }
    };
    var uploadObj = iteratorUploadObj( getActiveUploadObj, getFlashUploadObj, getFormUpladObj );
    

    4.4 迭代器模式小结

    迭代器模式是一种相对简单的模式,目前的绝大部分语言都内置了迭代器。

    系列链接

    1. JavaScript 设计模式(上)——基础知识
    2. JavaScript 设计模式(中)——1.单例模式
    3. JavaScript 设计模式(中)——2.策略模式
    4. JavaScript 设计模式(中)——3.代理模式
    5. JavaScript 设计模式(中)——4.迭代器模式
    6. JavaScript 设计模式(中)——5.发布订阅模式
    7. JavaScript 设计模式(中)——6.命令模式
    8. JavaScript 设计模式(中)——7.组合模式
    9. JavaScript 设计模式(中)——8.模板方法模式
    10. JavaScript 设计模式(中)——9.享元模式
    11. JavaScript 设计模式(中)——10.职责链模式
    12. JavaScript 设计模式(中)——11. 中介者模式
    13. JavaScript 设计模式(中)——12. 装饰者模式
    14. JavaScript 设计模式(中)——13.状态模式
    15. JavaScript 设计模式(中)——14.适配器模式
    16. JavaScript 设计模式(下)——设计原则
    17. JavaScript 设计模式练习代码

    本文主要参考了《JavaScript设计模式和开发实践》一书

    相关文章

      网友评论

          本文标题:JavaScript 设计模式(中)——4.迭代器模式

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