# 迭代器模式

## 模式动机

一个聚合对象，如一个列表或者一个集合，**应该提供一种方法来让别人可以访问它的元素，而又不需要暴露它的内部结构**。 针对不同的需要，可能还要以不同的方式遍历整个聚合对象，但是我们并不希望在聚合对象的抽象层接口中充斥着各种不同遍历的操作。

**怎样遍历一个聚合对象，又不需要了解聚合对象的内部结构，还能够提供多种不同的遍历方式，这就是迭代器模式所要解决的问题**

## 实现

### 内部迭代器

```javascript
const each = function(arg, callback) {
  for (let i = 0; i < arg.length; i++) {
    callback(i, arg[i])
  }
}

each([1, 2, 3], (index, value) => {
  console.info(index, value) 
})

/*打印结果
  0 1
  1 2
  2 3*/
```

### 外部迭代器

```javascript
const Iterator = function(obj) {
  let currentIndex = 0

  const next = function() {
    currentIndex++
  }

  const done = function() {
    return currentIndex >= obj.length
  }

  const getCurrentItem = function() {
    return obj[currentIndex]
  }

  return {
    next,
    done,
    getCurrentItem
  }
}
```

内部迭代器已经在内部定义好了迭代规则，只需要一次调用即可。外部迭代器的虽然增加一点调用的复杂度，但是我们可以手工控制迭代的过程和顺序。

## 小结

迭代器模式是一种相对简单的模式，简单到很多时候我们都不认为它是一种设计模式。目前的绝大部分语言都内置了迭代器
