📖

デザインパターン Iteratorパターンの学習

2024/09/16に公開

参考にしたもの

【脱オブジェクト指向初心者!】TypeScriptで学ぶSOLID原則・デザインパターン
https://www.udemy.com/course/typescript-solid-design-patterns/?couponCode=ST11MT91624A

Java言語で学ぶデザインパターン入門第3版
https://www.amazon.co.jp/Java言語で学ぶデザインパターン入門第3版-結城-浩/dp/4815609802

Iteratorパターンとは?

Iteratorの構成要素

  • Iterator
  • ConcreteIterator
  • Aggregate
  • ConcreteAggregate

Iterator

コレクションを探索するために必要な操作を定義するインターフェースです。
次の要素が存在するかどうかのhasNextメソッドと、次の要素を得るためのnextメソッドを定めています。

ConcreteIterator

Iteratorで定義したメソッドを実装するクラスです。
ConcreteIteratorの実装によって探索の内容を変更することができます。
探索を行うコレクションをフィールドに持ちます。

Aggregate

探索を行うコレクションを表すインターフェースです。
Iteratorを生成するためのメソッドを定義します。

ConcreteAggregate

Aggregateで定義したメソッドを実装するクラスです。
ConcreteIteratorクラスの新しいインスタンスを返却します。

Iteratorのメリット・デメリット

Iteratorのメリット

  • 利用者がコレクションの小さなデータ構造を知る必要がなくなります。
  • コレクションの実装と探索のためのアルゴリズムを分離することができます。
  • 既存のコードに修正を加えることなく、新しい種類のコレクションやイテレーターを追加できます。

Iteratorのデメリット

  • 単純なコレクションの場合、Iteratorを使用しない方がコードがシンプルになります。

Iteratorのクラス図

Iteratorを使う理由とは?

実装と切り離して繰り返し操作を行えるからです。

        while (it.hasNext()) {
            Book book = it.next();
            System.out.println(book.getName());
        }

ここで使われているのは、hasNextとnextというIteratorのメソッドだけです。
hasNextとnextのメソッドが正しく実装されているインスタンスを返してくれれば、上記のwhileループは全く変更しなくても動作します。
これにより、処理の再利用化が促進されて、クラスを部品として使いやすくできます。

Discussion