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

一、jQuery 中的迭代器
 $.each( [1,2,3,4], function (i, n) {
console.log( "当前下表为:" + i + " , 当前值为:" + n );
});
二、自实现一个迭代器
 // 自己实现一个数组迭代器
var each = function( arry, callback ){
for( var i = 0, l = arry.length; i < l; i++){
callback.call( arry[i], i, arry[ i ]);
}
};
each([1,2,3,4], function (i, n) {
console.log( i + " - " + n ); // 输出数组下标和值
});
三、内部迭代器

  上边的 each 函数属于内部迭代器, each 函数内部已经定义好了迭代原则,它完全接手整个迭代过程,外部只需要一次初始调用。
  内部迭代器的优点也刚好是它的缺点 - 使用方便,迭代交互也仅仅是一次初始调用
  示例: 在不改写 each 本身的代码前提,实现判断两个数组里元素的值是否完全相等
 //判断两个数组的值是否完全相等
var compare = function( arry1, arry2){
if( arry1.length !== arry2.length ){
throw new Error( "arry1和arry2不相等" );
}
each( arry1, function( i, n ){
if( n !== arry2[i] ){
throw new Error("arry1和arry2不相等");
}
});
console.log( "arry1和arry2相等" );
}; compare( [1,2,3,4], [1,2,3]);

 四、外部迭代器
  外部迭代器必须显式地请求迭代下一个元素
  外部迭代器增加了一些调用的复杂度,但相对的也增强了迭代器的灵活性,我们可以手工控制迭代的过程或者顺序
  示例: 重写 compare     外部迭代器:
 // 外部迭代器
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   
 // 改写 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();
}
console.log( "iterator1 和 iterator2相等" );
}; var iterator1 = Iterator( [1,2,3,4] );
var iterator2 = Iterator( [1,2,3,4] ); compare(iterator1,iterator2);

 五、中止迭代器
  重写 each 函数实现中止迭代
 // 重写 each 函数实现中止迭代
var each = function( arry, callback ){
for( var i = 0, l = arry.length; i < l; i++ ){
// callback 的执行结果返回false,提前中止迭代
if( callback( i, arry[i] ) === false ){
break;
}
}
};
each( [1,2,3,4,5], function ( i, n ) {
if( n>3 ){ // n 大于3的时候中止循环
return false;
}
console.log(n); // 输出 1 2 3
});

 六、迭代器应用示例
  目的:根据不同的浏览器获取相应的上传组件对象
    
    将不同的上传对象封装到各自的函数里; 如果函数可用,则返回该对象,否则返回false,提示迭代器继续
 // 将不同的上传对象封装到各自的函数里; 如果函数可用,则返回该对象,否则返回false,提示迭代器继续
var getActiveUploadObj = function(){
try{
return new ActiceXObject( "TXFTNActiveX.FTNUpload" ); // IE 上传控件
}catch(e){
return false;
}
};
var getFlashUploadObj = function(){
if( supportFlash() ){
var str = "<object type='application/x-shockwave-flash'></object>";
return $( str).appendTo( $("body") );
}
return false;
};
var getFormUpl0adObj = function(){
var str = "<input type='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, getFormUpl0adObj );

七、总结
迭代模式相对简单,简单到很多时候我们不认为它是一种设计模式
阅读参考书籍 - << JavaScript 设计模式与开发实践 >>

JavaScript设计模式 - 迭代器模式的更多相关文章

  1. javascript设计模式——迭代器模式

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

  2. javascript设计模式-迭代器模式(Iterator)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 19. 星际争霸之php设计模式--迭代器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. java设计模式——迭代器模式

    一. 定义与类型 定义:提供一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示 类型:行为型. 二. 使用场景 (1) 访问一个集合对象的内容而无需暴露它的内部表示 (2)  为遍 ...

  5. js设计模式--迭代器模式

    迭代器模式: 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示.js中我们经常会封装一个each函数用来实现迭代器. 理解的意思:提供一个方法,去把对象的每一项按 ...

  6. [Head First设计模式]生活中学设计模式——迭代器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  7. javascript 设计模式-----策略模式

    在<javascript设计模式>中,作者并没有向我们介绍策略模式,然而它却是一种在开发中十分常见的设计模式.最常见的就是当我们遇到一个复杂的表单验证的时候,常常需要编写一大段的if和el ...

  8. JAVA 设计模式 迭代器模式

    用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 迭代器模式是一种行为型模式. 结构

  9. 深入浅出设计模式——迭代器模式(Iterator Pattern)

    模式动机 一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构.针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我 ...

随机推荐

  1. BZOJ1036 树的统计

    Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...

  2. BZOJ2654 tree

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  3. debian , ubuntu 截取下拉菜单

    普通情况下print键很好用的,但是,截下拉菜单的时候,就怎么按都没反应了...然后换了shutter也不行,只能在静态界面截图.所以...然后就有了下面方法. 如果不是gnome怎么办?这个担心显然 ...

  4. 排序算法(一)(时间复杂度均为O(n*n))

    对于一个int数组,请编写一个选择排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 冒泡排序 ...

  5. easyui之datagrid的使用

    http://www.cnblogs.com/ruanmou001/p/3840954.html 一.神马是easyui jQuery EasyUI是一组基于jQuery的UI插件集合,而jQuery ...

  6. dto

    dto dto- datatransfer object(数据传输对象):dto在设计之初的主要考量是以粗粒度的数据结构减少网络通信并简化调用接口. http://www.cnblogs.com/wu ...

  7. Win7下JDK环境变量的设置

    JDK并不像Microsoft阵营vs那样智能,安装好后所有的东西都给你配置好了,我们还没需要手动配置很多东西 首先说为什么要配置JDK的环境变量在任何路径下识别java命令和java类 配置分为2个 ...

  8. JDK安装成功了,环境变量也配置好了,测试代码也可以运行,但是打不开eclipse

    解决办法:删除eclipse,重新解压后,将JDK文件夹下的jre文件夹拷贝到eclipse文件夹下,OK

  9. 转:Java NIO系列教程(三) Buffer

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

  10. font-family属性与字体对齐

    css中的font-family属性可以让我们自定义字体.在页面前端,宋体已经明日黄花,号称最贵中文字体的微软雅黑大行其道.英文字体万年不变,依然还是"arial","v ...