JS-Javascript 迭代器设计模式 Iterator pattern

这篇博文简短的提一下Iterator的设计模式,以及这种设计模式给我们带来什么样的好处。

1.begin

为了体现面向对象的特性(近年来的ES6为这方面做了很大的努力),此篇博文的语言编写基于typescript,当然也会附上原生js的书写方式。

1.1迭代器给我们带来了什么样的好处

迭代器可以使我们快速的遍历一个序列对象,一个良好的迭代器使我们不用了解该序列底层的结构,而只用关心拿到值之后的处理,并且迭代器是相当轻量的,对于创建一个迭代器,它的代码开销是非常小的。

1.2自己实现一个简单的js迭代器

在这里我们称为iterator设计模式,该设计模式就是为了创建一个简单的迭代器,当然时间有限,这里创建出来的迭代器以传入数组为基础进行迭代。

Typescript

interface MyIteratorInterface<T>{
    hasNext():boolean,
    next():T
}

class MyIterator<T> implements MyIteratorInterface<T>{
    //数组指针
    pointer:number = 0;
    //步长
    step:number;
    //数组对象
    arr:Array<T>;

    constructor(arr:Array<T>,step?:number){
        this.arr = arr;
        this.step = step || 1;
    }
    hasNext(){
        if(this.arr[this.pointer + this.step]){
            return true;
        }
        return false;
    }

    next(){
        while(this.pointer <= this.arr.length){
            if(this.pointer++ % this.step == 0){
                return this.arr[this.pointer - 1];
            }
        }
    }
}

let arr:number[] = [1,1,23,2,42,3,52,3,72,3];
let myIterator:MyIterator<number> = new MyIterator<number>(arr,3);

console.log(`next is ${myIterator.next()} and hasNext is ${myIterator.hasNext()}`);
console.log(`next is ${myIterator.next()} and hasNext is ${myIterator.hasNext()}`);
console.log(`next is ${myIterator.next()} and hasNext is ${myIterator.hasNext()}`);
console.log(`next is ${myIterator.next()} and hasNext is ${myIterator.hasNext()}`);
console.log(`next is ${myIterator.next()} and hasNext is ${myIterator.hasNext()}`);
console.log(`next is ${myIterator.next()} and hasNext is ${myIterator.hasNext()}`);
console.log(`next is ${myIterator.next()} and hasNext is ${myIterator.hasNext()}`);
console.log(`next is ${myIterator.next()} and hasNext is ${myIterator.hasNext()}`);

运行结果如下:
这里写图片描述

Javascript

//迭代器对象
let Iterator = function(arr,step){
    if(!arr || !step){
        throw new Error("arr and step is necessary");
    }
    //需要迭代的对象
    this.arr = arr;
    //当前迭代的指针
    this.cursor = 0;
    //迭代的步长
    this.step = step;
}

Iterator.prototype = {
    //获得下一个元素
    next:function(){
        while(this.cursor < this.arr.length){
            if(this.cursor++ % this.step == 0){
                return this.arr[this.cursor - 1];
            }
        }
    },
    //是否还有下一个元素
    hasNext:function(){
        let tempCursor = this.cursor;
        while(tempCursor < this.arr.length){
            if(tempCursor++ % this.step == 0){
                return true;
            }
        }
        return false;
    }
};

let it = new Iterator([1,2,42,3,52,3,2,4],2);
console.log(it.next(),it.hasNext());
console.log(it.next(),it.hasNext());
console.log(it.next(),it.hasNext());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值