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

2019-12-21  本文已影响0人  Haleng

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 内部迭代器和外部迭代器

实现判断 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设计模式和开发实践》一书

上一篇 下一篇

猜你喜欢

热点阅读