Iterator パターン (集約オブジェクトを内包するオブジェクトが内部表現を公開することなく, その要素に順にアクセスする方法を提供する)

[Iterate] という英単語は, 何かを [繰り返す] という意味.

[Iterator パターン] とは, ある集合体の要素一つ一つに, 順次アクセスする方法を提供するパターン.

役割

  1. Iterator (反復子):
要素に順次アクセスするインタフェースを定める.
  1. ConcreteIterator (具体的な反復子):
[Iterator] が定めたインタフェースを実装する. 順次アクセス方法, 次要素の有無などの手順の詳細処理を定義する. また, 上記処理の対象となるオブジェクト (ConcreteAggregate) を生成時 (コンストラクタ処理) に保持しておく.
  1. Aggregate (集合体):
[Iterator] を作り出すインタフェースを定める.
  1. ConcreteAggregate (具体的な集合体):
[Aggregate] が定めたインタフェースを実装する. [Iterator] メソッドで, 自身のオブジェクトをコンストラクタ引数に [ConcreteAggregate] のオブジェクトを返す.
  1. Item (集合体の各要素):
集合体の要素.
  1. Client (利用者):
[Iterator] パターンを適用したクラスを利用し処理する.

クラス図

Iterator パターンのクラス図

_images/designpattern-iterator011.gif

ソースコード

  1. Iterator.java
1
2
3
4
public interface Iterator{
    public abstract boolean hasNext();
    public abstract Object next();
}
  1. ConcreteIterator.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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++);
    }
}
  1. Aggregate.java
1
2
3
public interface Aggregate{
    public abstract Iterator iterator();
}
  1. ConcreteAggregate.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
    }
}
  1. Item.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class Item{
    private String name;

    public Item(String name){
	this.name = name;
    }

    public String getName(){
	return this.name;
    }
}
  1. Client.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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());
	}
    }
}

上記のプログラムの実行結果:

[wtopia Iterator]$ java Client
A
B
C
D