---
# System prepended metadata

title: Iterator

---

# Iterator
### 定義：不需要知道聚合物間的內部細節，即可依序存取內含的每個元素

#### 例如創造一個List去搭配一個ListIterator（外部Iterator）
![](https://i.imgur.com/8zUzskt.png)

#### 內部Iterator
![](https://i.imgur.com/Abjne9f.png)
```ruby=
class AlphabeticalOrderIterator

  include Enumerable

  attr_accessor :reverse
  private :reverse

  attr_accessor :collection
  private :collection

  def initialize(collection, reverse = false)
    @collection = collection
    @reverse = reverse
  end

  def each(&block)
    return @collection.reverse.each(&block) if reverse

    @collection.each(&block)
  end
end

class WordsCollection
  attr_accessor :collection
  private :collection

  def initialize(collection = [])
    @collection = collection
  end

  def iterator
    AlphabeticalOrderIterator.new(@collection)
  end

  def reverse_iterator
    AlphabeticalOrderIterator.new(@collection, true)
  end

  def add_item(item)
    @collection << item
  end
end

collection = WordsCollection.new
collection.add_item('First')
collection.add_item('Second')
collection.add_item('Third')

puts 'Straight traversal:'
collection.iterator.each { |item| puts item }
puts "\n"

puts 'Reverse traversal:'
collection.reverse_iterator.each { |item| puts item }
```

##### 由上述例子中其實可以看到，Collection(or List)與Iterator其實是有關連的，客戶端傳入的巡訪對象必須依照特定的聚合結構，而若是要依據不同聚合結構來改變Iterator的話，就要使用**多型巡訪**(polymorphic iteration)

![](https://i.imgur.com/0hCMqHS.png)

### 使用時機
1. 即使隊聚合物件內部結構一無所知，依然可以存取物件內容
2. 想以多種方式巡訪聚合物件時
3. 想用一至介面巡訪各種不同聚合結構時（多型巡訪）
![](https://i.imgur.com/KOf6uHc.png)

### 設計優點
1. 可以提供多種巡訪方式
2. Iterator簡化Aggregate介面
3. 針對同一聚合體，可以同時存在許多巡訪者駐足其中