迭代器模式

2017-05-21  本文已影响11人  星月西

1.迭代器模式

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

2.迭代器的两种实现

//数组的each内部迭代器
function each(array,func){
    for(var i=0,len=array.length;i<len;i++){
        func.call(array[i],i,array[i]);
    }
}

each([1,2,3],function(index,item){
    console.log(item);
});
//数组的外部迭代器
var iterator=function(obj){
    var current=0;

    function next(){
        current++;
    }

    function isDone(){
        return current>=obj.length;
    }

    function getCurItem(){
        return obj[current];
    }

    function reset(){
        current=0;
    }

    return {
        next: next,
        isDone: isDone,
        getCurItem: getCurItem,
        reset: reset
    };
}

function compare(a,b){
    while(!a.isDone() && !b.isDone()){
        if(a.getCurItem()!==b.getCurItem()){
            return false;
        }
        a.next();
        b.next();
    }
    return true;
}

var a=iterator([1,2,3]);
var b=iterator([1,2,3]);
console.log(compare(a,b));

3.迭代器模式的应用

例如要实现浏览器上传功能,使用浏览器的上传控件进行上传,速度快,可以暂停和续传,需要判断是否有上传控件,没有的话就用flash上传,如果没有flash上传,那就只能用原生的表单上传。
那么可以使用三个函数来分别判断每种方式的可行性,如果对象可用就返回该对象,如果不可用,则返回false,提示继续向后迭代。

//获取IE上传组件
    function getActive(){
        return false;
    }

    //获取flash上传控件
    function getFlash(){
        return false;
    }

    //获取表单上传控件
    function getForm(){
        return {};
    }

    //获取上传组件对象
    function iteratorUpload(){
        for(var i=0,len=arguments.length;i<len;i++){
            var value=arguments[i]()
            if(value!==false){
                return value;
            }
        }
    }
    var uploadObj=iteratorUpload(getActive,getFlash,getForm);
上一篇 下一篇

猜你喜欢

热点阅读