LoginSignup
0
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-11-20

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クラスを使った場合の変更したソースコードを記述する。(変更していない部分については、著作権を考慮して記載しません。原書を確認してください。)

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);
    }
}
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)」を見てみると、ArrayListも使えそうである。どなたか練習がてらに挑戦してみてはいかがでしょうか。 -->p14の練習問題の課題でした。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1