デザインパターン

【デザインパターン】Iterator パターンのJavaコード例

GoFのデザインパターンの一つである『Iterator パターン』 のサンプルコードの紹介です。

ディレクトリ構成

サンプルコードのディレクトリ構成は

・Iterator.java(インターフェース)

・Aggregate.java(インターフェース)

・BoxIterator.java(クラス, ConcreateIterator)

・Box.java(クラス, ConcreateAggregate)

・BoxDemo.java(クライアントクラス)

の5つとなります。

サンプルコード

Iterator.java

このjavaファイルは、Iteratorのインターフェースです。

抽象メソッドとして、

・hasNext(): 次の要素が存在するかどうか

・next(): 次の要素を返す

の二つを持ちます。

Aggregate.java

このjavaファイルは、Aggregateのインターフェースです。

抽象メソッドとして、

・iterator(): 具象クラスに対応したItetator型のイテレーターを返す

を持ちます。

これらの2つのインターフェースを具象クラスでimplementsしてやることでイテレーターを実装していくことになります。

BoxIterator.java

このクラスでは、実際にIteratorのメソッドを実装していきます。

今回作りたいクラスはBoxというクラスで、これはBoxのイテレーターになります。

どういう順番に要素を巡回していきたいかというのは個人の好みや考え方によるので、Iteratorの実装は基本的に作成者によります。

次に紹介するBoxクラスのメソッドを見ながらコードを理解して見てください。

Box.java

このBoxというクラスが中心となるクラスです。

Boxは配列に要素を追加できるようにしたものです。(配列は原則、初期化で指定した数だけしか要素を格納できないので)

『Listを使えばいいじゃ無いか!!』

と思った方もいるかもしれませんが、今回はイテレーターの有用さを理解するために敢えてBoxというクラスを作りました。

・getBoxContent(int index): index番目の要素を返す。配列と同じように0,1,2…という風に0から数えます。

・appendContent(Object content): contentをBoxの最後に追加します。ここでは1つ多く入る配列を作成してそこに全要素を移し替えています(あくまでテスト用なので、実用はしない方がいいです)

・getLength(): Boxの要素数を返します。

・iterator(): Boxのイテレーターを返します。

BoxDemo.java

BoxDemoクラスは、Boxクラスを使うクライアントクラスです。

今回はboxに1, aaa, 5, Aという4つの要素を追加してみました。

boxを巡回する際にはイテレーターを使用します。

配列や配列に似たデータ構造ならfor文でもいいかもしれませんが

連想配列や自作のデータ構造の場合は仕組みがより複雑になるので、for文を何重にもしたり面倒なことになります。

そこでイテレーターを使うと、クライアントに優しい方法でデータを取り出すことができるようになるわけです。

あわせて読みたい

ABOUT ME
miyadiary.net
当サイトを管理しています。IT(プログラミング)、旅行、アニメ関係などを中心とした総合ブログです。 私は主にIT技術についての記事を書いています。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です