Iteratorパターン

# Iteratorパターンについて

## 1. はじめに
Iteratorパターンは、集合体の各要素に、順番にアクセスして処理をするためのデザインパターン。
このパターンを使用すると、集合体の実装に関係なく独立して、Iteratorを部品として再利用できるようになる。
この文書では、Iteratorパターンの定義、実装方法について記載する。

## 2. Iteratorパターンの定義
Iteratorパターンは、集合体の要素にアクセスするための方法を提供する。
このパターンの主な目的は、集合体の内部構造を知らずに、順番にアクセスして処理をできるようにすることである。これにより、集合体の実装を変更しても、アクセス方法は変わらないという利点がある。

## 3. 主要なコンポーネント
Iteratorパターンは、以下の主要なコンポーネントから構成されている。

- **Iterator（反復子）**
  - 要素を順番に取得するためのインタフェースを定める

- **ConcreteIterator（具体的な反復子）**
  - Iteratorが定めたインタフェースを実装する
  - 順番に処理するための必要な情報を持っている必要がある
  
- **Aggregate（集合体）**
  - Iteratorを作り出すインタフェースを定める
  
- **ConcreteAggregate（具体的な集合体）**
  - Aggregateが定めたインタフェースを実際に実装する
  - ConcreteIteratorのインスタンスを作り出す

## 4. 実装例
### クラス図の紹介
以下のクラス図は、Iteratorパターンの構成要素を示している。


```plantuml
@startuml
interface Aggregate {
    iterator()
}

class ConcreteAggregate {
    iterator()
}

interface Iterator {
    next()
    hasNext()
}

class ConcreteIterator {
    aggregate
    next()
    hasNext()
}

Aggregate <|-- ConcreteAggregate
Iterator <|-- ConcreteIterator
ConcreteAggregate <--o ConcreteIterator
Aggregate --> Iterator : Creates >
@enduml
```


### 具体的なコード例
以下は、JavaでのIteratorパターンの実装例である。
作成するプログラムは本棚に本を入れてその本の名前を順番に表示するもの。

```java
// Aggregate.java
public interface Aggregate {
  public abstract Iterator iterator();
}


// Iterator.java
public interface Iterator {
  public abstract boolean hasNext();
  public abstract Object next();
}


// Book.java
public class Book {
  private String name;
  public Book(String name) {
    this.name = name;
  }
  public String getName() {
    return name;
  }
}


// BookShelf.java
import java.util.ArrayList;

public class BookShelf implements Aggregate {
  private ArrayList<Book> books;
  public BookShelf(int initialsize) {
    this.books = new ArrayList<Book>(initialsize);
  }
  public Book getBookAt(int index) {
    return (Book)books.get(index);
  }
  public void appendBook(Book book) {
    books.add(book);
  }
  public int getLength() {
    return books.size();
  }
  public Iterator iterator() {
    return new BookShelfIterator(this);
  }
}


// BookShelfIterator.java
public class BookShelfIterator implements Iterator {
  private BookShelf bookShelf;
  private int index;
  public BookShelfIterator(BookShelf bookShelf) {
    this.bookShelf = bookShelf;
    this.index = 0;
  }
  public boolean hasNext() {
    if (index < bookShelf.getLength()) {
      return true;
    } else {
      return false;
    }
  }
  public Object next() {
    Book book = bookShelf.getBookAt(index);
    index++;
    return book;
  }
}


// IteratorTest.java
public class IteratorTest {
  public static void main(String[] args) {
    BookShelf bookShelf = new BookShelf(4);
    bookShelf.appendBook(new Book("Around the World in 80 Days"));
    bookShelf.appendBook(new Book("Bible"));
    bookShelf.appendBook(new Book("Cinderella"));
    bookShelf.appendBook(new Book("Daddy-Long-Legs"));
    bookShelf.appendBook(new Book("East of Eden"));
    bookShelf.appendBook(new Book("Franakenstein"));
    bookShelf.appendBook(new Book("Gulliver's Travels"));
    bookShelf.appendBook(new Book("Hamlet"));
    Iterator it = bookShelf.iterator();
    while (it.hasNext()) {
      Book book = (Book)it.next();
      System.out.println(book.getName());
    }
  }
}
```

## 参考文献
[増補改訂版Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030?ie=UTF8&qid=1454743284&sr=8-1&keywords=java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80)