「Java言語で学ぶデザインパターン入門」を元にデザインパターンを学習していますが、
Iteratorパターンを使うべきケースが理解できません。
書籍内のサンプルでは本の集合を表すBookShelfクラスにて、下記2つのメソッドを定義しています。
・本の冊数を返す。 int getLength ( )
・index番目の本を返す。 Book getBookAt ( int index )
MainクラスにてIteratorパターンを用いて、下記のように走査してますが、
lang
1Iterator it = book_shelf.iterator(); 2 while(it.hasNext()) { 3 Book book = (Book)it.next(); 4 System.out.println(book.getName()); 5 }
Iteratorパターンを用いずに下記のようなfor文で問題ないと考えてます。
lang
1 for (int i = 0; i < bookShelf.getLength(); i++) { 2 Book book = bookShelf.getBook(i); 3 System.out.println(book.getName()); 4 }
Iteratorパターンのメリットは
BookShelfクラスの実装を、現状の配列ではなく、Vectorを使うようにしても、BookShelfクラスを利用する側は変更しなくて済む。
と説明されてますが、これは「int getLength()」メソッドと「Book getBookAt()」が同じように機能するのであれば、forループの場合と比べて何ら変わりありません。
上記を踏まえた上で、Iteratorパターンのメリット、使うべきケースについてご教示頂けますと幸いです。
なお、似たような記事を見つけましたが、こちらの内容ではいまいち理解できませんでした。
http://www.aerith.net/design/Iterator-j.html
下記、参考までにソースを記載致します。
Aggregate.java
lang
1public interface Aggregate { 2 3 public abstract Iterator iterator(); 4}
Iterator.java
lang
1public interface Iterator { 2 public abstract boolean hasNext(); 3 public abstract Object next(); 4}
BookShelf.java
lang
1import java.util.*; 2 3public class BookShelf implements Aggregate { 4 5 private List<Book> books = new ArrayList<Book>(); 6 public Book getBook(int index) { 7 return books.get(index); 8 } 9 public void appendBook(Book book) { 10 books.add(book); 11 } 12 public int getLength() { 13 return books.size(); 14 } 15 public Iterator iterator() { 16 return new BookShelfIterator(this); 17 } 18}
BookShelfIterator .java
lang
1public class BookShelfIterator implements Iterator { 2 3 private BookShelf bookShelf; 4 private int index; 5 6 public BookShelfIterator(BookShelf bookShelf) { 7 this.bookShelf = bookShelf; 8 this.index = 0; 9 } 10 11 public boolean hasNext() { 12 if (index < bookShelf.getLength()) { 13 return true; 14 } else { 15 return false; 16 } 17 } 18 19 public Object next() { 20 Book book = bookShelf.getBook(index); 21 index++; 22 return book; 23 } 24}
Main.java
lang
1public class Main { 2 3 public static void main(String[] args) { 4 5 BookShelf bookShelf = new BookShelf(); 6 bookShelf.appendBook(new Book("Around the World in 80 Days")); 7 bookShelf.appendBook(new Book("Bible")); 8 bookShelf.appendBook(new Book("Cinderella")); 9 bookShelf.appendBook(new Book("Daddy-Long-Legs")); 10 11 Iterator it = bookShelf.iterator(); 12 13 while(it.hasNext()) { 14 Book book = (Book)it.next(); 15 System.out.println(book.getName()); 16 } 17 18 //for (int i = 0; i < bookShelf.getLength(); i++) { 19 // Book book = bookShelf.getBook(i); 20 // System.out.println(book.getName()); 21 //} 22 } 23}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/13 16:51
2015/06/13 17:05