Iteratorパターン


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

Iteratorパターンとは、1つ1つを数えるためのパターンである。

配列などをfor文でループさせながら一つずつ数えていく処理と同様で、添え字で使用する変数を抽象化、一般化したものをIteratorパターンという。

for(int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
}
※上記の「i」を指す

Iteratorパターンを実装するには以下の4つのクラス、インターフェースが必要

  1. Iterator 要素の数え上げを行うインターフェース
  2. ConcreteIterator 要素の数え上げを行う処理の実装クラス
  3. Aggregate 数え上げを行うものの集合を現すインターフェース
  4. ConcreteAggregate 数え上げを行うものの集合を現す実装クラス

Iteratorパターンのメリット
  • 実際に数える集合体の構造に左右されること無く数え上げの実装が行える。
  • 数え上げを行うクラスが外だしされているため、異なる数え上げの方法がクラスを分けることによってバリエーションを作ることが出来る。



ちなみに、Javaの拡張for構文は内部的にIteratorを使っているらしい
Javaではjava.util.Iterator(ConcreteIteratorクラス)とList(Aggregateインターフェース)を使って実装することも可能
Java1.5ではjava.lang.Iteratableインターフェースが追加されている


実装
Iteratorインタフェース
package iterator;

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

Aggregateインタフェース
package iterator;

public interface Aggregate {
    public IteratorImpl iterator();
}

Iteratorの実装
package iterator;

public class IteratorImpl implements Iterator {

    AggregateImpl aggregate;
    int index = 0;
    
    /**
    * コンストラクタ。
    * 
    * @param aggregate Aggregate実装クラス
    */
   public IteratorImpl(AggregateImpl aggregate) {
	this.aggregate = aggregate;
    }

    @Override
    public boolean hasNext() {
	if(this.index < this.aggregate.getLength()){
	    return true;
	}
	return false;
    }

    @Override
   public Object next() {
	String data = this.aggregate.get(this.index);
	this.index++;
	
	return data;
    }
}

Aggregateの実装
package iterator;

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

public class AggregateImpl implements Aggregate {

    List<String> list = new ArrayList<String>();

    public void add(String data) {
	list.add(data);
    }

    public String get(int index) {
	return list.get(index);
    }

    public int getLength() {
	return list.size();
    }

    @Override
    public IteratorImpl iterator() {
	return new IteratorImpl(this);
   }

Main
package iterator;

public class Main {

    /**
     * メインメソッド。
     * 
     * @param args
     */
    public static void main(String[] args) {

	AggregateImpl aggregate = new AggregateImpl();
	aggregate.add("テスト1");
	aggregate.add("テスト2");
	aggregate.add("テスト3");
	aggregate.add("テスト4");
	
	Iterator ite = aggregate.iterator();

	while (ite.hasNext()) {
	    System.out.println(ite.next());
	}
    }
}

Iteratorを使うメリット
データの保持方法や数え上げの方法に依存せずにメインの実装が可能であること。
上記例の場合、Listの管理をVecterや配列に変えてもメインの実装には影響が無い。