Javascript Patterns--读书笔记9 (Iterator)

如果你有一个对象,它包含一组有序的聚簇数据(其实就是一个或者一组利用某种结构聚集起来的数据),你如果想要一种统一的并且是简单的访问接口来访问这一组数据,那么iterator就可以发挥它的用武之地了。调用这个对象的code不需要了解你对象的数据结构,它们唯一需要知道的是如何来得到其中的每一个元素。

在Iterator模式中,你的object需要提供一个next()方法,当调用next()的时候,它必须返回你这个对象中的下一个element, 当然这取决于你的数据结构,来确定下一个element到底是哪一个元素,有可能是物理不挨着,或者是出于某种目的,你给他们人为的排序。

当然我们还得需要提供另一个函数,hasNext()用来告诉你是否已经取到最后一个元素了。

让我们先来看一下两段测试用例,就是我们如何用next()和hasNext():

View Code
var element;
while (elemnet = agg.next()) {
   //do something with the element ....
  console.log(element);  
}
View Code
while(agg.hasNext()) {
    //do something with the next element...
    console.log(agg.next());
}

我们在还没有编码的情况下,而先把测试用例准备好的开发方法被称之为TDD

让我们来实现具体的编码,先设计一下,当我们在实现iterator模式的时候,我们用到的数据不需要对外公开,而只需要接口对外公开,所以我们把它定义成private是很合适的,同理还有index(即是用来指示当前数据的指针)。为了演示和简单的目的, 我们选用普通的array.

View Code
//采用利即执行函数来得到一个对象,这是闭包的一个应用
var agg = (function(){
    var index = 0,
        data = [1, 2, 3, 4, 5],
        length = data.length;
    //返回的实际上是这个literal object
    return {
        next: function() {
            var element;
            if(!this.hasNext()) {
                return null;
            }
            element = data[index];
            index = index + 1;
            return element;
        },
        hasNext: function() {
            return index < length;
        }
    };
}());

上面那些只是必须有的方法,有时我们为了方便,会多加些方法:

rewind(): 把指针移到第一个元素上

currennt():返回当前的指针所指向的元素

View Code
//采用利即执行函数来得到一个对象,这是闭包的一个应用
var agg = (function(){
    var index = 0,
        data = [1, 2, 3, 4, 5],
        length = data.length;
    //返回的实际上是这个literal object
    return {
        next: function() {
            var element;
            if(!this.hasNext()) {
                return null;
            }
            element = data[index];
            index = index + 1;
            return element;
        },
        hasNext: function() {
            return index < length;
        },
        rewind: function() {
            index = 0;
        },
        current: function() {
            return data[index];
        }
    };
}());

 

posted @ 2012-10-08 16:33  moonreplace  阅读(338)  评论(0编辑  收藏  举报