結城本「Java言語で学ぶデザインパターン入門」第１章IteratorパターンのBookShelfを配列からVector(可変長配列)に書き換えてみた

#1.概要
　結城本[「Java言語で学ぶデザインパターン入門（増補改訂版）」](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88-Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9-ebook/dp/B00I8ATHGW/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80&qid=1637371043&s=books&sr=1-2)第１章Iteratorパターンのp11ページに中ほどに次のように記述がある。
　　　「BookShelfを実装した人が、配列を使って本を管理することをやめて、java.util.Vectorを使うようにプログラムを修正したとしましょう....」
　なるほど、Vector(可変長配列)を使って配列部分を書き換えられるのか、と言うことで、以下のように書き換えてみました。
　（なお、最近[第３](https://www.amazon.co.jp/Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80%E7%AC%AC3%E7%89%88-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4815609802/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80&qid=1637371043&s=books&sr=1-1)版が出版されたようで、この版で本記事が参考になるかどうかわかりません。ご容赦ください。）

#2.Vectorクラスを使うにあたって参考にしたサイト
(1)[【Java入門】Vectorクラスで可変長配列を扱う方法(add/remove/size)](https://www.sejuku.net/blog/56356)
(2) [Java8リファレンス](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Vector.html)

#3.Vectorクラスを使うにあたり変更したクラス
Iteratorパターンに使うクラスの内、実装部分にあたるBookShelfクラスとBookShelfIteratorクラスを変更した。

|Iteratorパターン登場人物|クラス名|変更有無|
|---|---|:-:|
|Aggregateインタフェース|Aggregateインタフェース|なし|
|Iteratorインタフェース|Iteratorインタフェース|なし|
|ConcreeAggregateクラス|BookShelfクラス|あり|
|ConcreteIteratorクラス|BookShelfIteratorクラス|なし|
|なし|Bookクラス|なし|
|なし|Mainクラス|あり|

#4.変更したソースコード
　配列の代わりにVectorクラスを使った場合の変更したソースコードを記述する。（変更していない部分については、著作権を考慮して記載しません。原書を確認してください。）

```java:BookShelf
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);
    }
}
```

```java:Main.java
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)](https://www.sejuku.net/blog/56356)」を見てみると、ArrayListも使えそうである。どなたか練習がてらに挑戦してみてはいかがでしょうか。~~  －－＞p14の練習問題の課題でした。