「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つに、順次アクセスする方法を提供するパターンです。
Iteratorパターンのクラス図
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