デザインパターン-Iterator

Iterator(イテレータ)パターンとは

Iteratorパターンは、要素の集まりを保有するオブジェクトの各要素に順番にアクセスする方法を提供するためのパターンです。

iterateとは「繰り返す」という意味であり、iteratorは「反復子」と呼ばれます。


GoF本でIteratorパターンの目的は次のように定義されています。


集約オブジェクトが基にある内部表現を公開せずに、その要素に順にアクセスする方法を提供する。

Iteratorパターンの利用場面

  • 配列やコレクションなどの集合する要素に対してアクセスする必要がある場合。
  • 集合の要素に順次にアクセスする必要がある場合。

Iteratorパターンのメリット

Iteratorパターンは「順次アクセスする方法」を外部クラスに委譲することです。

つまり、リストのように複数のオブジェクトをまとめる集約オブジェクトを走査するためのAPIを提供します。

利用側は集約オブジェクトの内部を意識することなく要素にアクセスできるため、異なる内部構造を持つリストの要素に同じAPIでアクセスできます。


リストを走査する処理はすべて外部クラス内に閉じられますので、リストの内部構造を意識することなく走査することができます。

リストの具体的な内部構造を隠蔽し、個々の機能を適当なクラスに持たせることで、オブジェクト指向の単一責任原則に準拠します。


また、集合要素に複数の順次アクセス方法を提供することが可能になります。

走査処理の具体的な実装を変えることで、逆方向に走査させたり任意の要素に直接アクセスさせることもできます。


仕様変更が発生した場合、集合体(Aggregate)と反復ロジック(Iterator)の分離が行われているので、処理の変更範囲を極めて限定的とすることが可能となります。


Iteratorパターンの実装案

  • Iteratorインタフェース
    • 順次にアクセスするためのhasNext()、next()メソッドを定義します。
  • ConcreteIteratorクラス
    • Iteratorインタフェースを実装したクラス。
  • Aggregateインタフェース
    • 個々要素の集まりの抽象インタフェース。
    • Iterator iterator()メソッドを定義しています。
  • ConcreteAggregateクラス
    • Aggregateの実装クラス。

JavaでのイテレータAPI


//java.util.Iterator
public interface java.util.Iterator {
    boolean hasNext();
    Object next();
}
  • メソッドhasNext()は、オブジェクト郡の中にまだアクセスしていないオブジェクトがあるかをtrueかfalseで返します。
  • メソッドnext()は、次のオブジェクトを返します。戻り値がObjectになっているのは、どんなオブジェクトでも良いようにです。

RubyでのIteratorパターン

RubyではIteratorパターンは言語として組み込まれています。


array.each do |elm|
  puts elm
end

関連ページ