Java言語で学ぶデザインパターン入門』を読んで、学んだ内容についてまとめます。IteratorパターンIteratorとはIteratorとは英単語で日本語では「反復子」を意味します。プログラミングにおいては、集合体に対して順次にアクセスを行う際に、「指し示すもの」を抽象化し、一般化したものを意味します。この説明だけではイメージが掴みにくいと思うので、もう少し具体的な例をあげます。以下のような配列arrayの要素を全て表示するような繰り返し文を書いたことがある人は多いのではないでしょうか。System.out.println(array[i]);}ここで変数iは配列arrayの添え字となり、配列の持つ要素に順次にアクセスを行っています。このように「繰り返して全体を指し示し、走査を行う」ものがIteratorです。登場人物Itaratorパターンで使用するのは以下のクラス図に登場するクラスとインターフェースです。インターフェースAggreate数え上げを行う対象の「集合体」を表します。メソッドとしてはIterator()のみを持ちます。これはIterator生成するために使用します。iterator();}Iterator集合の要素の「数え上げを行うもの」を表します。メソッドとしてはhasNext()とnext()の2つを持ちます。hasNext()は次の要素を持つかどうかを確認するために使用します。next()は次の要素があった際に次の要素を取得するために使用します。next();}実装クラスインターフェースを実装し、具体的な処理を記述します。具体例については後述いたします。具体例として、「従業員をまとめる従業員リスト」と「従業員リストのIterator」をもとに説明します。実装クラスEmployeeクラスEmployee(従業員)クラスは集合体の要素を表します。名前と従業員コードを持ちます。}}EmployeeListクラスEmployeeList(従業員リスト)クラスは従業員の集合体を表します。従業員の配列と添え字を持ちます。iterator()において自身を引数としてEmployeeListIteratorを生成して返しています。}}EmployeeListIteratorクラスEmployeeListIterator(従業員リストIterator)クラスは従業員の集合体を数え上げるものを表します。従業員リストと添え字を持ちます。hasNext()で従業員リストが次の要素を持つかを確認し、next()で従業員リストの次の要素(従業員)を返却しています。アクセスを行う方法は様々ですが、今回は単純に前から順次でアクセスする実装を行います。}}実行クラスMainクラス従業員リストに従業員を追加し、追加した従業員の名前と従業員コードを従業員リストから出力しています。}}実行結果Main.classを実行した結果は以下になります。employeeListに追加した順にきちんと出力されていることが確認できます。実行結果Tarou_Tanaka:C001Hanako_Yamada:C002Yuuya_Suzuki:C003Kanako_Satou:C004メリットIteratorを使用することで数え上げを行う際に集合体がどのような集合体であるか(配列、ArrayList、Vectorなど)、どのような実装が行われているかを意識する必要がなくなります。以下で集合体を配列からArrayListに変更したEmployeeList.classを定義します。この時、実行クラスのMain.classを修正する必要はなく、実行結果は配列の場合と同様です。(2018/10/31)Iteratorには前から順次でアクセスする以外にも様々なアクセス方法があります。(逆順、1つ飛ばしなど)今回はArrayListで逆順でアクセスするIteratorを追加いたしました。差分のあるクラスのみ掲載しますので、その他のクラスについてはまとめで確認してください。インタフェースAggregate逆順にアクセスするIteratorを生成するreverseIterator()を追加しています。reverseIterator();}実装クラスEmployeeListクラスreverseIterator()を追加しています。reverseIterator()において自身を引数としてEmployeeListReverseIteratorを生成して返しています。}}EmployeeListReverseIteratorクラス新規に作成するクラスですが、順次アクセスを行うEmployeeListIterator.classと同様にhasNext()とnext()を実装しています。コンストラクタでemployeeListの要素数から1を引いた数字をindexに持ちます。これにより仮に要素数が5のリストからは4を取得することになります。hasNext()ではArrayListの要素の数だけ逆順からアクセスを行います。注意すべき点としてはループの条件でindexが0未満にならないようにする必要があることです。この条件がなければnext()でemployeeList[-1]にアクセスしようとしてしまいArrayIndexOutOfBoundsExceptionが発生します。}}実行クラスMainクラスEmployeeListにEmployeeを追加し、順次で出力をした後、逆順で出力を行っています。}}実行結果Main.classを実行した結果は以下になります。employeeListに追加した順と、追加したものと逆順で出力されていることが確認できます。-------Kanako_Satou:C004Yuuya_Suzuki:C003Hanako_Yamada:C002Tarou_Tanaka:C001まとめ集合体に順次にアクセスを行うIteratorパターンに関して学びました。以下でサンプルコードをアップしていますのでよろしければ参考にどうぞ。Iteratorサンプルコードまた、他のデザインパターンに関しては以下でまとめていますので、こちらも参考にどうぞ。requestStockLike2@mk777SIer→Webに転職したエンジニア。学んだことなどをまとめていきます。upLoginユーザーは見つかりませんでした。