资讯专栏INFORMATION COLUMN

迭代器模式

LuDongWei / 286人阅读

摘要:不暴露该对象的内部表示是指在通过迭代器访问聚合中元素时迭代器访问接口统一不用关心对象内部细节。虽然灵活但是调用复杂度增加必须熟悉迭代器接口。

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

关于这个定义的个人理解,聚合对象是指可遍历的对象,一般具有的特征就是可用下标访问且具有length属性。

不暴露该对象的内部表示是指在通过迭代器访问聚合中元素时,迭代器访问接口统一,不用关心对象内部细节。

迭代器分类 内部迭代器
内部迭代器是指外界不用关心迭代器内部实现,初始调用一次迭代器就可以实现遍历功能了。
    
        let each=function (ary,cb) {
            for(let i=0,len=ary.length;i
外部迭代器

外部迭代器是指必须显式的请求迭代下一个元素

    class Iterator{
    
        constructor(obj){
            this.obj=obj;
            this.current=0;
        }
        next() {
            this.current+=1;
        }
        isDone() {
            return this.current>=this.obj.length
        }
        getCurrentItem () {
            return this.obj[this.current];
        }
    }
    
    let iterator1=new Iterator([1,2,3]);
    console.log(iterator1.next())
    console.log(iterator1.getCurrentItem())  //2
    

外部迭代器相对内部迭代器的优点是,可以手工控制迭代过程。虽然灵活,但是调用复杂度增加,必须熟悉迭代器接口。

实战应用 案例一
let getUploadObjA=function () {
    try{
        throw "testA";
    }catch (e){
        return false;
    }
}
let getUploadObjB=function () {
    return "testB";
}
let getUploadObjC=function () {
    try{
        throw "testC";
    }catch (e){
        return false;
    }
}

let iteratorUploadObj=function () {
    for(let i=0,len=arguments.length;i

说明 其实在日常开发中,例如上传文件有很多方式,插件,h5,input的file方式等等,根据兼容性,设定支持的先后顺序放在迭代器中,以后维护时时若有其它方式
直接往迭代器中添加就行,非常方便。总的来说就是方便代码维护且具有良好的拓展性。

案例2
let isType=function (type) {
    return function (obj) {
        return Object.prototype.toString.call(obj)==="[object "+type+"]";
    }
}

let isWindow=isType("Window");

function isArraylike(obj) {
    let len="length" in obj &&obj.length;
    let typeObj=typeof obj;
    let typeLen=typeof len;
    
    if(typeObj ==="function" ||isWindow(obj)){
        return false;
    }
    //Element
    if(obj.nodeType==1&&len){
        return true;
    }
    return typeObj === "array" ||len===0 ||typeLen =="number" &&len>0 &&(len-1) in obj;
}
each=function (obj,cb) {
    let value,
        i=0,
        length=obj.length,
        isArray=isArraylike(obj);
    if(isArray){
        for(;i

说明 上面实现了一个通用的迭代器。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66731.html

相关文章

  • Python进阶:设计模式迭代模式

    摘要:抓住了迭代器模式的本质,即是迭代,赋予了它极高的地位。输出结果输出结果小结迭代器模式几乎是种设计模式中最常用的设计模式,本文主要介绍了是如何运用迭代器模式,并介绍了模块生成迭代器的种方法,以及种生成迭代器的内置方法。 showImg(https://segmentfault.com/img/bVbmv7W?w=4272&h=2848); 在软件开发领域中,人们经常会用到这一个概念——设...

    pubdreamcc 评论0 收藏0
  • Python进阶:设计模式迭代模式

    摘要:抓住了迭代器模式的本质,即是迭代,赋予了它极高的地位。输出结果输出结果小结迭代器模式几乎是种设计模式中最常用的设计模式,本文主要介绍了是如何运用迭代器模式,并介绍了模块生成迭代器的种方法,以及种生成迭代器的内置方法。 showImg(https://segmentfault.com/img/bVbmv7W?w=4272&h=2848); 在软件开发领域中,人们经常会用到这一个概念——设...

    sherlock221 评论0 收藏0
  • 迭代模式

    摘要:迭代器模式的结构抽象容器一般是一个接口,提供一个方法,例如中的接口,接口,接口等。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。 定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。 类型:行为类模式。 类图:showImg(https://segmentfault.com/img/bVWQIQ?w=542&h=287);...

    xcc3641 评论0 收藏0
  • 每天一个设计模式·迭代模式

    摘要:迭代器模式原文地址更多设计模式系列教程更多免费教程博主按每天一个设计模式旨在初步领会设计模式的精髓,目前采用靠这吃饭和纯粹喜欢两种语言实现。迭代器模式常见和常用的有内部迭代器外部迭代器倒序迭代器等等。 迭代器模式·原文地址 更多《设计模式系列教程》 更多免费教程 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(靠这吃饭)和python(纯粹喜欢...

    沈俭 评论0 收藏0

发表评论

0条评论

LuDongWei

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<