美文网首页前端进阶与开发实践
翻滚吧,设计模式之04迭代器模式笔记

翻滚吧,设计模式之04迭代器模式笔记

作者: 莫闻 | 来源:发表于2017-05-28 20:36 被阅读2次

    什么是迭代器模式

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

    • jq中的迭代器
    $.each( [1,2,3], function(i, v) {
          //xxx
        console.log(this);// ==> 等价于v
    });
    
    • 自己实现一个简单的迭代器
    var each = function(arr, fn) {
      for(var i = 0; i < arr.length; i++){
        if(fn.call(arr[i], i, arr[i]) === false){
          break; //模仿jq,在jq中each返回false是就会中断迭代
        };//这里当调用this的的时候就是arr[i],同上面jq中的用法
      }
    },
    

    迭代器的分类

    1. 内部迭代器
      前面的each的实现就是内部迭代器,它在内部已经定义好了规则,完全接手整个规则,外部只需要一次调用。
      但是有一个需求比较两个数组是否完全相等,each方法就不那么好用了。
    var compare = function(arr1, arr2){
      if(arr1.length !== arr2.length){
        throw new Error("不等");
        return false;
      }
      each(arr1, function(i, v){
        if(v !== arr2[i]){
          throw new Error("不等");
        }
      });
    }
    compare( [1,2,3], [4,5,6]);//
    
    1. 外部迭代器
      外部迭代器必须显式地请求迭代下一个元素。
            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 ];
                };
                var length = function(){
                    return obj.length;
                };
                return {
                    next: next,
                    isDone: isDone,
                    getCurrItem: getCurrItem,
                    length: length
                }
            };
    
            var compare = function( iterator1, iterator2 ){
                if(iterator1.length !== iterator2.length){
                    alert ( 'iterator1 和 iterator2 不相等' );
                    return false;
                }
                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, 2 ] );
            var iterator2 = Iterator( [ 1, 2, 3 ] );
            compare( iterator1, iterator2 ); // 输出: iterator1 和 iterator2 不相等
    

    可以使用在:

    在不同的浏览器环境下,选择的上传方式是不一样的。因为使用浏览器的上传控件进行上传速度快,可以暂停和续传,所以我们首先会使用

    1. 控件上传。如果浏览器没有安装上传控件,则使用
    2. Flash 上传, 如果连Flash 也没安装,那就只好使用
    3. 浏览器原生的表单上传了。
    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 
    );
    //由于只有这几种情况,所以就会匹配到一种,然后直接执行即可。
    

    相关文章

      网友评论

        本文标题:翻滚吧,设计模式之04迭代器模式笔记

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