質問
結城著「デザインパターン(増補改訂版)」(以下、当該書籍)にて、デザインパータンを勉強しています。
第1章Iteratorパターンに以下のようなクラス図が記述されています。
(尚、本クラス図は、原本にはないMainクラスを追記しています。またMainクラスからBookShelfクラスへの関連の線が、破線になるのか実線になるのか、矢印が必要か否かわからないので、とりあえず破線でつないでいます。悪しからず、ご了承ください。)
さて本題に移ります。赤線で強調した部分ですが、AggregateインタフェースとIteratorインタフェースの間の関連の説明「Creates(生成)」になっています。なぜ、AggregateインタフェースとIteratorインタフェースの間に関連として「Creates(生成)」の線が引けるのか、疑問に思い質問します。
「Creates」の意味は、「AAAクラスがBBBクラスを生成する」と言うことだと理解しています(当該書籍、xxxiiページに記述)。私の理解でソースコードを書けば、次のようにAAAクラスの中のメソッドでBBBクラスをnewすることだと考えています。
Java
1class AAA { 2 public BBB abc() { 3 ........ 4 return new BBB(); 5 } 6}
しかし、当該書籍に記述されたAggregateインタフェースのソースコード(上記クラスを記述したソースコードは、下の方にまとめて掲載)には、上記に類するコードはありません。それらしいコードは、BookShelfクラスのiterator()メソッドではないかと思います。
Java
1// ConcreteAggregate役 2public class BookShelf implements Aggregate { 3 ...... 4 public Iterator iterator(){ 5 return new BookShelfIterator(this); 6 } 7} 8
なぜ、赤線で強調した関連が「Creates(生成)」がになっているのでしょうか?またこのCreatesが意味するソースコードは、どの部分なのでしょうか?
お手数をお掛けしますが、ご教示の程よろしくお願いします。
ソースコード
上記クラス図のソースコードを以下に示します。
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// 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
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 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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/04 10:30 編集