質問
結城著「Java言語で学ぶデザインパターン入門(増補改訂版)」(以下、当該書籍)にて、デザインパータンを勉強しています。(新刊の第3版はこちら)
第1章Iteratorパターンに以下のようなクラス図が記述されています。
ソースコードをみると、Aggregateインタフェース、Iteratorインタフェース、BookShelfクラス、BookShelfIteratorクラス、Bookクラスの5つの他に、Mainクラスがあります。
Mainクラスは、説明上、イテレータパターンでは重要でないのでクラス図に描かかれていないのだと思いますが、敢えて記載すると次のクラス図の赤線部分のように、「MainクラスとBookShelfクラスの間に関連の線を引き、名前をUses(使う)」と記述すればいいでしょうか?(あるいは、別の線種でしょうか?)
Mainクラス、BookShelfクラス他のソースコードを、以下のソースコード一覧の項目に示します。
ご教示の程、よろしくお願いします。
ソースコード一覧
上記クラス図のソースコードを以下に示します。
Java
1public class Main { 2 public static void main(String[] args){ 3 // 本棚を作る 4 BookShelf bookShelf = new BookShelf(4); 5 6 // 本棚に本を登録する 7 bookShelf.appendBook(new Book("Around the world in 80 Days")); 8 bookShelf.appendBook(new Book("Bible")); 9 bookShelf.appendBook(new Book("Cinderella")); 10 bookShelf.appendBook(new Book("Daddy-Long-Legs")); 11 12 // 本棚に収納した本を数えだすためにイテレータのインスタンスを呼び出す 13 Iterator it = bookShelf.iterator(); 14 while(it.hasNext()){ 15 Book book = (Book)it.next(); 16 System.out.println(book.getName()); 17 } 18 } 19} 20
Java
1// ConcreteAggregate役 2public class BookShelf implements Aggregate { 3 private Book[] books; 4 private int last = 0; 5 6 // 本棚を作るコンストラクタ(本棚にしまえる本の最大冊数を指定) 7 public BookShelf(int maxsize){ 8 this.books = new Book[maxsize]; 9 } 10 11 // 指定したインデックスの本を取り出す(返す) 12 public Book getBookAt(int index){ 13 return books[index]; 14 } 15 16 // 本を追加する 17 public void appendBook(Book book){ 18 this.books[last] = book; 19 last++; 20 } 21 22 // 現在本棚に収納されている本棚の冊数を返す 23 public int getLength() { 24 return last; 25 } 26 27 28 public Iterator iterator(){ 29 return new BookShelfIterator(this); 30 } 31}
Java
1public interface Aggregate{ 2 public abstract Iterator iterator(); 3}
Java
1public interface Iterator{ 2 public abstract boolean hasNext(); // 次の要素があるかどうか調べるメソッド 3 public abstract Object next(); // 次の要素を得るためのメソッド 4}
Java
1// ConcreteIterator役 2public class BookShelfIterator implements Iterator { 3 private BookShelf bookShelf; 4 private int index; // 要素の数をカウントアップするインデックス 5 6 // コンストラクタ 7 public BookShelfIterator(BookShelf bookShelf){ 8 this.bookShelf = bookShelf; 9 this.index = 0; 10 } 11 12 // 次の要素の有無を調べるメソッド 13 // 現在のインデックスが本棚に収納されている冊数を超えていないか調べることで 14 // 次の要素が歩かないかを返す 15 public boolean hasNext(){ 16 if(index < bookShelf.getLength()){ 17 return true; 18 } else { 19 return false;} 20 } 21 22 // 次の本を取り出すメソッド 23 // 現在のインデックスを本棚に与えその番号の本を取り出す 24 public Object next(){ 25 Book book = bookShelf.getBookAt(index); 26 index++; 27 return book; 28 } 29}
Java
1public class Book{ 2 private String name; 3 4 public Book(String name){ 5 this.name = name; 6 } 7 8 public String getName(){ 9 return name; 10 } 11}
