技術のメモ箱

デザインパターン/Iterator

概要

集合体の要素を1つ1つ数え上げる

集合体の実装に依存せず、すべての要素を1つずつ取り出せる。
数え上げの仕組みがAggregateの外にあるのが特徴。

スキャンには最後尾から逆方向に進むなどさまざまなバリエーションがある。
ちなみに1つのAggregateの具象に対し複数のIteratorの具象を作ることが可能。

Iteratorのメソッドは名前が処理内容を表しきれていないので注意。
→nextメソッドは現在の要素を返しつつ、次の位置に進める。
→hasNextメソッドは次にnextメソッドを読んでも大丈夫かどうか調べる。

サンプルコード

Aggregate(集合体)

public interface Aggregate {
    public abstract Iterator iterator();
}

Iterator(反復子)

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

要素の集合体(Aggregateの具象)

public class BookShelf implements Aggregate {
    private Book[] books;
    private int last = 0;
    public BookShelf(int maxsize) {
        this.books = new Book[maxsize];
    }
    public Book getBookAt(int index) {
        return books[index];
    }
    public void appendBook(Book book) {
        this.books[last] = book;
        last++;
    }
    public int getLength() {
        return last;
    }
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}

1つの要素

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

走査の実装(Iteratorの具象)

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;
    }
}

Mainクラス

public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf(3);
        bookShelf.appendBook(new Book("Book1"));
        bookShelf.appendBook(new Book("Book2"));
        bookShelf.appendBook(new Book("Book3"));
        Iterator it = bookShelf.iterator();
        while(it.hasNext()) {
            Book book = (Book) it.next();
            System.out.println(book.getName());
        }
    }
}
pagetop