Iteratorパターン
今更ながらデザインパターンを勉強を開始。基礎が大事。
Iteratorパターン。練習問題をジェネリックも意識して解いてみました。
ジェネリックにするとキャスト不要で安全です。
// Aggregate.java public interface Aggregate<T> { public abstract Iterator<T> iterator(); } // BookShelf.java import java.util.ArrayList; import java.util.List; public class BookShelf implements Aggregate<Book> { private List<Book> books; private int last; public BookShelf() { this.books = new ArrayList<Book>(); } public Book getBookAt(int index) { return books.get(index); } public void addBook(Book book) { this.books.add(book); last++; } public int getLength() { return last; } @Override public Iterator<Book> iterator() { return new BookShelfIterator(this); } } // Book.java public class Book { private String name; public Book(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } // Iterator.java public interface Iterator<T> { public abstract boolean hasNext(); public abstract T next(); } // BookShelfIterator.java public class BookShelfIterator implements Iterator<Book> { private BookShelf bookshelf; private int index; public BookShelfIterator(BookShelf bookshelf) { this.bookshelf = bookshelf; this.index = 0; } @Override public boolean hasNext() { if (index < bookshelf.getLength()) { return true; } return false; } @Override public Book next() { Book book = bookshelf.getBookAt(index); index++; return book; } } // Main.java public class Main { public static void main(String[] args) { BookShelf bookshelf = new BookShelf(); for (int i = 0; i < 10; i++) { bookshelf.addBook(new Book("Book-" + String.valueOf(i))); } Iterator<Book> it = bookshelf.iterator(); while (it.hasNext()) { System.out.println(it.next().getName()); } } }
出力は
Book-0 Book-1 Book-2 Book-3 Book-4 Book-5 Book-6 Book-7 Book-8 Book-9