「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