Iteratorパターン
何かが複数あるときに、それを順番に指し示していき、全体をスキャンする処理
登場人物
Iterator
要素を順番にスキャンしていくインターフェース(API)を定める(Iterator.java)
ConcreteIterator
Iteratorが定めたインターフェース(API)を実際に実装する(BookShelfIterator.java)
Aggregate
Iteratorを作り出すインターフェース(API)を定める(Aggregate.java)
ConcreateAggregate
Aggregateが定めたインターフェース(API)を実際に実装する(BookShelf.java)
どうしてIteratorを使うのか
実装と切り離して数え上げを行うことができる
以下のように、BookShelfの実装に依存することなく反復処理が行える
code:java
while (it.hasNext()) {
Book book = (Book)it.next();
System.out.println(book.getName());
}
Interfaceを使うことで密結合にならず疎結合になる
色々なIterator
最後尾から開始して逆方向に進む
順方向にも逆方向にもスキャンする
インデックスを指定してジャンプする
deleteIteratorは不要
使われなくなったインスタンスはGCで自動的に削除されるため
関連するパターン
code:Book.java
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
code:BookShelf.java
public class BookShelf implements Aggregate { // Bookの集合体として扱うためにAggregate Interfaceを実装
private Book[] books;
private int last = 0;
public BookShelf(int maxsize) {
}
public Book getBookAt(int index) {
}
public void appendBook(Book book) {
last++;
}
public int getLength() {
return last;
}
// Aggregate Interfaceで実装されていたiterator method
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
code:Iterator.java
public interface Iterator {
// 次の要素の存在を確認
public abstract boolean hasNext();
// 次の要素を取得
public abstract Object next();
}
code:BookShelfIterator.java
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
// 最後の要素を得たあとはfalseを返す
public boolean hasNext() {
if (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
}
// 現在の要素を返しつつ、次の位置へ進めている
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
code:Aggregate.java
public interface Aggregate {
/**
* 数え上げを行うものの集合体
*/
public abstract Iterator iterator();
}
code:Main.java
import java.util.*;
public class Main {
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"));
// BookShelfIterator型ではなくIterator型の変数に入れている
Iterator it = bookShelf.iterator();
while (it.hasNext()) {
Book book = (Book)it.next();
System.out.println(book.getName());
}
}
}