迭代器模式

迭代器模式就是提供一种接口,用户可以按照某种顺序访问数据,但是不需要了解数据的内部表示和具体操作。

jquery中的each和对象遍历的for in都是一种迭代器模式,不过这种迭代模式有个不好的地方是,他是从第一个元素一直迭代到最后一个元素的,即使他提供了停下来的功能,下次迭代的时候。还是会从头开始迭代,所以说他是无记忆的,如果我们需要在一个循环之内和之外连续地按序访问某个数据集,那就需要一个有记忆功能的迭代器。

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
class Iterator {
constructor(data) {
this.data = data.getData();
this.position = 0;
}


hasNext() {
return this.position < this.data.length
}


next() {
if (this.hasNext()) {
return this.data[this.position++];
}
else {
return;
}
}


len() {
return this.data.length;
}


getPosition() {
return this.position;
}


InitPosition(position) {
this.position = 0;
}


// back(step) {
// this.position--;
// }
// go(step) {
// if(step!==undefined) {
// return (this.position+=step);
// }
// return this.position++;
// }
}


class Data {
constructor(data){
this.data = data;
}


getData() {
return this.data;
}


push(arg) {
Array.prototype.push.apply(this.data,arguments);
}


pop(){
Array.prototype.pop.apply(this.data);
}
}
var data = new Data([3,4,1,2,3]);
var iterator = new Iterator(data);
while(iterator.hasNext()) {
var result = iterator.next();
if(result==1){
break;
}
console.log(result,iterator.getPosition());
}
console.log(iterator.hasNext() && iterator.next())
</script>
</body>
</html>

如果我们在某个迭代中遇到某种情况就会跳出循环,然后在循环外的某个地方继续在原来的位置访问数据集,这时候记忆功能就比较重要,而且提供了一个initPosition函数初始化迭代器的位置,这样就可以从头开始继续迭代了。代码中把数据的增删等会影响数据集长度的操作放到数据类中,访问性的操作则放到迭代器类里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值