デザインパターン-Iterator



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

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

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


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

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

Iteratorパターンの利用場面


Iteratorパターンのメリット

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

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

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


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

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


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

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


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


Iteratorパターンの実装案


JavaでのイテレータAPI

//java.util.Iterator
public interface java.util.Iterator {
    boolean hasNext();
    Object next();
}

RubyでのIteratorパターン

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

array.each do |elm|
  puts elm
end

関連ページ



スポンサード リンク