PS: すべての素晴らしいことは、日常的になると貴重さを失います。
イテレーターデザインパターンは、一連の要素に順番にアクセスする方法を提供するための一般的なデザインパターンであり、同時にそのオブジェクトの内部表現を公開しません。イテレーターデザインパターンは、動作型デザインパターンに属しています。
- 関連する概念
- 使用シーン
- Java の実装
- Dart の実装
関連する概念#
- 抽象集約役:集約オブジェクトの追加、削除などの操作メソッドとイテレーターの作成メソッドを定義します。
- 具体的な集約役:抽象集約役の具体的な実装クラスです。
- 抽象イテレーター役:イテレーターに関連するメソッドを定義します。例えば、hasNext、first、last などのメソッドです。
- 具体的なイテレーター役:抽象イテレーター役の具体的な実装クラスです。
使用シーン#
イテレーターデザインパターンの使用シーンは以下の通りです:
- 特定のデータ構造のための反復方法を提供するため。
- 集約オブジェクトの実装の詳細を隠すためにイテレーターデザインパターンを使用することができます。
- 複数の集約オブジェクトが存在する場合、イテレーターデザインパターンを使用すると、データ構造の違いを隠すことができます。
Java の実装#
イテレーターデザインパターンの簡単な実装例を以下に示します。抽象集約役の定義は次のようになります:
/**
* 抽象集約役
* Created by jzman
* Powered by 2019/12/22.
*/
interface Aggregate {
Iterator createIterator();
}
抽象イテレーター役の定義は次のようになります:
/**
* 抽象イテレーター役
* Created by jzman
* Powered by 2019/12/22.
*/
interface Iterator {
Object first();
Object next();
boolean isDone();
Object currentItem();
}
具体的な集約役と具体的なイテレーター役の実装は次のようになります:
/**
* 具体的な集約役
* Created by jzman
* Powered by 2019/12/22.
*/
class ConcreteAggregate implements Aggregate {
private List<Object> mList;
public ConcreteAggregate(List<Object> mList) {
this.mList = mList;
}
@Override
public Iterator createIterator() {
return new ConcreteIterator();
}
/**
* 具体的なイテレーター役
*/
private class ConcreteIterator implements Iterator {
private int mCursor;
@Override
public Object first() {
return mList.get(0);
}
@Override
public Object next() {
mCursor++;
if (mCursor < mList.size()) {
return mList.get(mCursor);
}
return null;
}
@Override
public boolean isDone() {
return mCursor >= mList.size();
}
@Override
public Object currentItem() {
return mList.get(mCursor);
}
}
}
上記のコードをテストします:
/**
* イテレーターテスト
* Created by jzman
* Powered by 2019/12/22.
*/
class Client {
public static void main(String[] args) {
List<Object> objects = new ArrayList<>();
objects.add("A");
objects.add("B");
objects.add("C");
ConcreteAggregate aggregate = new ConcreteAggregate(objects);
// イテレーターを取得
Iterator iterator = aggregate.createIterator();
// 反復
while (!iterator.isDone()) {
Object o = iterator.currentItem();
System.out.println("data:" + o);
iterator.next();
}
}
}
テスト結果は以下の通りです:
data:A
data:B
data:C
Dart の実装#
main(){
List<Object> mList = ["A","B","C"];
Aggregate aggregate = new ConcreteAggregate(mList);
Iterator iterator = aggregate.createIterator();
while (!iterator.isDone()) {
Object obj = iterator.currentItem();
print("data:${obj.toString()}");
iterator.next();
}
}
// 抽象イテレーター役
abstract class Iterator{
Object first();
Object next();
bool isDone();
Object currentItem();
}
//具体イテレーター役
class ConcreteIterator implements Iterator{
int mCursor = 0;
List<Object> mList;
ConcreteIterator(this.mList);
@override
Object first() {
return mList[0];
}
@override
Object next() {
mCursor++;
if (mCursor < mList.length) {
return mList[mCursor];
}
return null;
}
@override
bool isDone() {
return mCursor >= mList.length;
}
@override
Object currentItem() {
return mList[mCursor];
}
}
// 抽象集約役
abstract class Aggregate {
Iterator createIterator();
}
// 具体集約役
class ConcreteAggregate implements Aggregate{
List<Object> mList;
ConcreteAggregate(this.mList);
@override
Iterator createIterator(){
return new ConcreteIterator(mList);
}
}
テスト結果は以下の通りです:
data:A
data:B
data:C
イテレーターデザインパターンは、コレクションの反復処理に頻繁に使用されますが、使用する際にはデザインパターンの概念がないかもしれません。しかし、このような概念は、自分のコーディング能力を潜在的に向上させることがあります。