ぴぐノート

Good code is its own best documentation.

デザインパターン

数え上げのデザインパターン Iteratorパターン

投稿日:

デザインパターンの中でももっとも理解がしやすく、また利用価値も高いものでIteratorパターンがあります。
Iteratorパターンは数え上げのためのパターンです。
顧客管理では顧客をあいうえお順に並べたり取引日時でソートをかけたりすることもありますし、ゲーム制作であればキャラクターの並び、アイテムの並びなど複数の集合に対して全体をスキャンするといったことは頻繁に登場します。

デザインパターンの触りとしてではなく抽象クラスやインターフェイスの勉強としても利用できます。

イテレータパターンとは

実際に何かを表示する場合には並び順が重要になります。
追加した順番や割り振られた番号順、あいうえお順などなど。
ゲームをよくされる人であればアイテムの並び順がユーザビリティに大きく影響することをよく知っているかと思います。

このイテレータパターンはオブジェクトの集合に対して、順番に指し示し全体をスキャンするために利用されるものです。
イテレータパターンの説明によく用いられる、本クラスと本棚クラスを例に見ていきましょう。

イテレータパターンの実装

ここでは以下のクラス・インターフェイスを作成します。

Aggregateインターフェイス

集合を表すインターフェイス。Iteratorインターフェイスの作成を宣言します

Iteratorインターフェイス

ループ変数のような役割を果たすインターフェイス。
次の要素があるかどうかを返すhasNextメソッドと、次の要素を指し示すnextメソッドを宣言します。

Bookクラス

1冊の本を表すクラス。説明を簡単にするため本の名前を得るメソッドだけを定義します。

BookShelfクラス

本棚クラス。本の集合体として扱うのでAggregateインターフェイスを実装します。

BookShelfIteratorクラス

BookShelfクラスをスキャンするするクラス。Iteratorインターフェイスを実装します。
どの本棚をスキャンするかはコンストラクタで指定できるようにしています。

Mainクラス

サンプルコードを実際に動作させるクラス。

サンプルコードのクラス図

上記の説明の補足としてクラス図も確認しておきましょう。

iterator_class_diagram
小難しいことはこれくらいにして、実際にコーディングしてみましょう。

コーディング

Aggregateインターフェイス

Iteratorインターフェイス

Bookクラス

BookShelfクラス

BookShelfIteratorクラス

Mainクラス

イテレータパターンがなぜ必要なのか

なぜ本棚が持つ本をループで回すだけなのにこんな面倒な実装をしなければならないのでしょう?
重要なヒントとなるのはMainクラスの以下の部分です。

ループの部分ではBookShelfクラスのメソッドは使用されていません。
つまりBookShelfの実装には依存しないのです。
例えば本クラスを配列で持つことを止め、Vectorクラスを利用するように修正しても正しいIteratorを返しさえすれば上記のループは全く変更する必要がありません。

デザインパターンの根底にあるクラスの再利用化という観点からみても大きな利点となります。

まとめ

Iteratorパターンは簡単に実装できますし、デザインパターンの触りとしても大変すぐれています。
今回は順番にアクセスするだけの単純なものですが、AggregateインターフェイスにreverseIteratorなどを宣言すれば逆順にスキャンするようなものも簡単に作れます。

サンプルプログラムを参考に配列をArrayListに変更してみたり、reverseIteratorを実装してみてください。

スポンサーリンク

スポンサーリンク

-デザインパターン

執筆者:

関連記事

アルゴリズムを定義してロジックはサブクラスに任せるTemplateパターン

今回紹介するTemplateパターンは比較的理解しやすいデザインパターンです。 タイトルにもあるように、「アルゴリズムだけを定義し、詳しい実装についてはサブクラスに任せる」ような仕組み、これがTemp …

再利用のためのデザインパターン Adapterパターン

実際の業務で新しいコードを1から書き始めるなんてことは滅多にありません。 基本は既にあるコードを追加・修正しバージョンアップを重ねるという業務がほとんどですね。 また1から作る場合でも別のプロジェクト …

オブジェクトの生成に一工夫!FactoryMethodパターン

みなさんは「工場」と言われたときに何の工場を想像するでしょうか? 車に、缶詰、飲み物などいろいろな工場があります。 今回紹介するFactoryMethodパターンは、「オブジェクトを生成する方法」に一 …

インスタンスが1つしか作られないように制限するSingleton(シングルトン)パターン

もっとも頻繁に使われるデザインパターンといえば、Singletonパターンでしょう。 このSingletonパターンには、「インスタンスが1つしか作られないことを保証する」という意味が含まれます。 も …