美文网首页前端进阶与开发实践
翻滚吧,设计模式之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