1.概要
結城本「Java言語で学ぶデザインパターン入門(増補改訂版)」第1章Iteratorパターンのp11ページに中ほどに次のように記述がある。
「BookShelfを実装した人が、配列を使って本を管理することをやめて、java.util.Vectorを使うようにプログラムを修正したとしましょう....」
なるほど、Vector(可変長配列)を使って配列部分を書き換えられるのか、と言うことで、以下のように書き換えてみました。
(なお、最近第3版が出版されたようで、この版で本記事が参考になるかどうかわかりません。ご容赦ください。)
2.Vectorクラスを使うにあたって参考にしたサイト
(1)【Java入門】Vectorクラスで可変長配列を扱う方法(add/remove/size)
(2) Java8リファレンス
3.Vectorクラスを使うにあたり変更したクラス
Iteratorパターンに使うクラスの内、実装部分にあたるBookShelfクラスとBookShelfIteratorクラスを変更した。
Iteratorパターン登場人物 | クラス名 | 変更有無 |
---|---|---|
Aggregateインタフェース | Aggregateインタフェース | なし |
Iteratorインタフェース | Iteratorインタフェース | なし |
ConcreeAggregateクラス | BookShelfクラス | あり |
ConcreteIteratorクラス | BookShelfIteratorクラス | なし |
なし | Bookクラス | なし |
なし | Mainクラス | あり |
4.変更したソースコード
配列の代わりにVectorクラスを使った場合の変更したソースコードを記述する。(変更していない部分については、著作権を考慮して記載しません。原書を確認してください。)
import java.util.Vector;
public class BookShelf implements Aggregate{
//Book型配列の宣言を削除
private Vector<Book> books = new Vector<>(); //VerctorクラスでBook型の可変長配列を宣言(追加)
// 配列に追加した本の数量をカウントする変数lastを削除
//本棚にしまう本の最大数を初期化するコンストラクタを削除
public Book getBookAt(int index){
return books.get(index); //配列の要素の取得方法を変更
}
public void appendBook(Book book){
this.books.add(book); //配列の要素の追加方法を変更
//本を追加した時の冊数をカウントするカウンタを削除
}
public int getLength(){
return books.size(); // 配列の大きさの取得方法を変更
}
public Iterator iterator(){
return new BookShelfIterator(this);
}
}
public class Main{
public static void main(String[] args){
// 本棚を作ることを宣言
BookShelf bookShelf = new BookShelf(); // 本棚に置く本の数を指定しないように変更
// 本を書棚に登録
bookShelf.appendBook(new Book("Around the World in 80 Days"));
bookShelf.appendBook(new Book("Bible"));
bookShelf.appendBook(new Book("Cinderella"));
bookShelf.appendBook(new Book("Daddy-Long=Lens"));
//本棚のイテレーターを宣言
Iterator it = bookShelf.iterator();
while (it.hasNext()){ //次に本があるか確認
Book book = (Book)it.next(); //次にある本を取り出す
System.out.println("" + book.getName()); //本の名前を表示
}
}
}
5.さいごに
Iterotorパターンに使われている固定長の配列を可変長配列に変更した。「【Java入門】Vectorクラスで可変長配列を扱う方法(add/remove/size)」を見てみると、ArrayListも使えそうである。どなたか練習がてらに挑戦してみてはいかがでしょうか。 -->p14の練習問題の課題でした。