迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。
4 迭代器模式 迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。
4.1 each 函数 1 2 3 4 5 6 7 8 var each = function ( ary, callback ) { for ( var i = 0 , l = ary.length; i < l; i++ ){ callback.call( ary[i], i, ary[ i ] ); } }; each( [ 1 , 2 , 3 ], function ( i, n ) { alert ( [ i, n ] ); });
4.2 内部迭代器和外部迭代器
内部迭代器:外界不用关心迭代器内部的实现,跟迭代器的交互也仅仅是一次初始调用,如 each 函数;
外部迭代器:必须显式地请求迭代下一个元素;增加了一些调用的复杂度,但相对也增强了迭代器的灵活性,可以手工控制迭代的过程或者顺序;
实现判断 2 个数组里元素的值是否完全相等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 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 ] ); 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 );
4.3 迭代器模式的应用举例 文件上传模块中,根据不同的浏览器获取相应的上传组件对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 var getUploadObj = function ( ) { try { return new ActiveXObject("TXFTNActiveX.FTNUpload" ); }catch (e){ if ( 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" ); }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 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 迭代器模式小结 迭代器模式是一种相对简单的模式,目前的绝大部分语言都内置了迭代器。
系列链接
JavaScript 设计模式基础知识
JavaScript 设计模式(一)单例模式
JavaScript 设计模式(二)策略模式
JavaScript 设计模式(三)代理模式
JavaScript 设计模式(四)迭代器模式
JavaScript 设计模式(五)发布订阅模式
JavaScript 设计模式(六)命令模式
JavaScript 设计模式(七)组合模式
JavaScript 设计模式(八)模板方法模式
JavaScript 设计模式(九)享元模式
JavaScript 设计模式(十)职责链模式
JavaScript 设计模式(十一)中介者模式
JavaScript 设计模式(十二)装饰者模式
JavaScript 设计模式(十三)状态模式
JavaScript 设计模式(十四)适配器模式
JavaScript 设计模式(下)设计原则
JavaScript 设计模式练习代码