Iterator パターン

「Iterate」という英単語は、何かを「繰返す」という意味です。

プログラムで「繰返す」と聞いて思い出すのは、「for loop」文ではないでしょうか?以下のJavaコードを見て下さい。


for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
}

ループ変数iは、「0」で初期化され、「1」「2」…と配列の要素数分まで順に増えて行きます。その度に、配列(集合体)の該当するインデックス番号iの要素を1つ取出して出力させています。実は上記処理で使用されているループ変数iの役割をパターン化したものが、「Iterator パターン」です。つまり、「Iterator パターン」とは、ある集合体の要素1つ1つに、順次アクセスする方法を提供するパターンです。


役割り

1. Iterator(反復子)
要素に順次アクセスするインタフェースを定めます。
2. ConcreteIterator(具体的な反復子)
「Iterator」が定めたインタフェースを実装します。順次アクセス方法・次要素の有無等の手順の詳細処理を定義します。また、上記処理の対象となるオブジェクト(ConcreteAggregate)を生成時(コンストラクタ処理)に保持しておきます。
3. Aggregate(集合体)
「Iterator」を作り出すインタフェースを定めます。
4. ConcreteAggregate(具体的な集合体)
「Aggregate」が定めたインタフェースを実装します。「iterator」メソッドで、自身のオブジェクトをコンストラクタ引数に「ConcreteAggregate」のオブジェクトを返します。(取扱い方法(次の要素の有無確認方法・次の要素の取得方法)の定まった集合体オブジェクトを返す)
5. Item(集合体の各要素)
集合体の要素です。
6. Client(利用者)
「Iterator」パターンを適用したクラスを利用し処理します。

▲PageTop

クラス図

Iteratorパターンのクラス図

Iteratorパターン クラス図

▲PageTop

サンプル

ソースコード

1. Iterator.java

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}

2. ConcreteIterator.java

public class ConcreteIterator implements Iterator {
    private ConcreteAggregate concreteAggregate;
    private int index = 0;
    public ConcreteIterator(ConcreteAggregate concreteAggregate) {
        this.concreteAggregate = concreteAggregate;
    }
    public boolean hasNext() {
        if (index < concreteAggregate.getSize()) {
            return true;
        } else {
            return false;
        }
    }
    public Object next() {
        return concreteAggregate.getItemAt(index++);
    }
}

3. Aggregate.java

public interface Aggregate {
    public abstract Iterator iterator();
}

4. ConcreteAggregate.java

import java.util.ArrayList;
import java.util.List;

public class ConcreteAggregate implements Aggregate {
    private List<Item> items = new ArrayList<Item>();
    public void addItem(Item item) {
        items.add(item);
    }
    public int getSize() {
        return items.size();
    }
    public Item getItemAt(int index) {
        return (Item) items.get(index);
    }
    public Iterator iterator() {
        return new ConcreteIterator(this);
    }
}

5. Item.java

public class Item {
    private String name;
    public Item(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
}

6. Client.java

public class Client {
    public static void main(String[] args) {
        ConcreteAggregate a = new ConcreteAggregate();
        a.addItem(new Item("A"));
        a.addItem(new Item("B"));
        a.addItem(new Item("C"));
        a.addItem(new Item("D"));
        Iterator it = a.iterator();
        while (it.hasNext()) {
            Item item = (Item) it.next();
            System.out.println(item.getName());
        }
    }
}

実行結果

C:\sample\desin_pattern\iterator>javac Client.java [Enter]

C:\sample\desin_pattern\iterator>java Client [Enter]
A
B
C
D
        

▲PageTop