Iteratorパターン

「Iteratorパターン」の編集履歴(バックアップ)一覧はこちら

Iteratorパターン」(2009/04/02 (木) 01:05:49) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

Iteratorパターンとは、1つ1つを数えるためのパターンである。 配列などをfor文でループさせながら一つずつ数えていく処理と同様で、添え字で使用する変数を抽象化、一般化したものをIteratorパターンという。 for(int i = 0; i < array.length; i++) { System.out.println(array[i]); } ※上記の「i」を指す Iteratorパターンを実装するには以下の4つのクラス、インターフェースが必要 +Iterator 要素の数え上げを行うインターフェース +ConcreteIterator 要素の数え上げを行う処理の実装クラス +Aggregate 数え上げを行うものの集合を現すインターフェース +ConcreteAggregate 数え上げを行うものの集合を現す実装クラス Iteratorパターンのメリット ・実際に数える集合体の構造に左右されること無く数え上げの実装が行える。 ・数え上げを行うクラスが外だしされているため、異なる数え上げの方法がクラスを分けることによってバリエーションを作ることが出来る。 ちなみに、Javaの拡張for構文は内部的にIteratorを使っているらしい Javaではjava.util.Iterator(ConcreteIteratorクラス)とList(Aggregateインターフェース)を使って実装することも可能 Java1.5ではjava.lang.Iteratableインターフェースが追加されている 実装はそのうち・・・
Iteratorパターンとは、1つ1つを数えるためのパターンである。 配列などをfor文でループさせながら一つずつ数えていく処理と同様で、添え字で使用する変数を抽象化、一般化したものをIteratorパターンという。 for(int i = 0; i < array.length; i++) { System.out.println(array[i]); } ※上記の「i」を指す Iteratorパターンを実装するには以下の4つのクラス、インターフェースが必要 +Iterator 要素の数え上げを行うインターフェース +ConcreteIterator 要素の数え上げを行う処理の実装クラス +Aggregate 数え上げを行うものの集合を現すインターフェース +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や配列に変えてもメインの実装には影響が無い。

表示オプション

横に並べて表示:
変化行の前後のみ表示: