迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
如今大部分语言已经内置迭代器的实现,如foreach、for( obj in arr){ }等
无迭代实现不同浏览器环境下上传数据
该方法充斥着try-catch,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'));
}
}
};
使用迭代模式的上传代码
/************* 各个上传方法 **********/
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 getFormUploadObj = function(){
var str = '<input name="file" type="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, getFormUploadObj);
这样只需修改iteratorUploadObj
的参数顺序,就可以改变调用顺序,而不必改变原整个函数的代码。
网友评论