Design Pattern / Behavioral

[デザインパターン] Iterator パターン

コレクションの内部構造を隠し、走査する手段だけを公開するパターン。

  • Design Pattern
  • Behavioral
目次

パターンの一行要約

コレクションの内部構造を隠し、走査する手段だけを公開するパターン。

Unityでの典型的な使用例

  • インベントリやクエストリストを一貫した方法で走査したい場合。
  • コレクション実装の変更による影響を抑えたい場合。

構成要素(役割)

  • Aggregate
  • Iterator
  • Client

Unityサンプル(C#)

以下のコードは、上記のシナリオを基にした簡略化された Unity の例です。

using System.Collections;
using System.Collections.Generic;

public sealed class InventoryCollection : IEnumerable<InventoryItem>
{
    private readonly List<InventoryItem> items = new();

    public void Add(InventoryItem item)
    {
        items.Add(item);
    }

    public IEnumerator<InventoryItem> GetEnumerator()
    {
        foreach (InventoryItem item in items)
        {
            yield return item;
        }
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

利点

  • 振る舞いが小さな単位に分離されるため、変更の影響範囲を抑えられます。
  • ルールの追加や差し替えが比較的安全に行えます。

注意点

  • オブジェクト数や間接呼び出しが増えると、フローを追いにくくなります。
  • 順序に関するバグはテストで確実に固めておくべきです。

相互作用図

内部表現を露出せずに順次アクセスを提供するフローを示します。

flowchart LR

  client["Client"]
  aggregate["Inventory"]
  iterator["InventoryIterator"]
  check["HasNext?"]
  next["Next()"]
  value["Current Item"]

  client -- "CreateIterator()" --> aggregate
  aggregate --> iterator
  client --> check
  check -->|true| next
  next --> value
  value --> client
  next -->|loop| check
  check -->|false| client

コメント