Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [① Iterator]

概要

iterateは日本語で「繰り返す」,iteratorは日本語で「反復子」という意味になる.Iteratorパターンは,オブジェクトの集合に対して順序良くアクセスする方法を提供したパターンである.

Iteratorパターンの主な要素は以下である.

  • Iterator:オブジェクト要素にアクセスし,走査するためのインターフェースを定義する
  • ConcreteIterator:Iteratorインターフェースを実装する.
  • Aggregate:Iteratorオブジェクトを生成するインターフェースを定義する
  • ConcreteAggregate:Aggregateインターフェースを実装し,ConcreteIteratorのインスタンスを返す.

クラス図

画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

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

// Iterator Interface
interface Iterator<T> {
    boolean hasNext();
    T next();
}

// Aggregate (Collection) Interface
interface Aggregate<T> {
    Iterator<T> iterator();
}

// Concrete Iterator
class ConcreteIterator<T> implements Iterator<T> {
    private List<T> list;
    private int cursor;

    public ConcreteIterator(List<T> list) {
        this.list = list;
        this.cursor = 0;
    }

    @Override
    public boolean hasNext() {
        return cursor != list.size();
    }

    @Override
    public T next() {
        T obj = null;
        if (this.hasNext()) {
            obj = this.list.get(cursor++);
        }
        return obj;
    }
}

// Concrete Aggregate
class ConcreteAggregate<T> implements Aggregate<T> {
    private List<T> list;

    public ConcreteAggregate() {
        this.list = new ArrayList<>();
    }

    public void add(T obj) {
        this.list.add(obj);
    }

    @Override
    public Iterator<T> iterator() {
        return new ConcreteIterator<>(this.list);
    }
}

// Client
public class IteratorPattern {
    public static void main(String[] args) {
        ConcreteAggregate<String> aggregate = new ConcreteAggregate<>();
        aggregate.add("A");
        aggregate.add("B");
        aggregate.add("C");

        Iterator<String> iterator = aggregate.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

まとめ,所感

Aggregateはオブジェクトの集合体を保持・管理しておくためのもの,Iteratorはオブジェクトの集合体からオブジェクトを順に列挙していくものという感覚?

  • Aggregate:オブジェクトの追加
  • Iterator:オブジェクトの取り出し