迭代器模式 → イテレータパターン

イテレータパターン(Iterator Pattern)は、Java および .Net プログラミング環境で非常に一般のに使用されるデザインパターンです。

イテレータパターンは、集約オブジェクト内の各要素に順番にアクセスする方法を提供し、その内部表現を公開しません。

イテレータパターンは、振る舞いパターンに属します。

紹介

意図

オブジェクトの内部表現を公開せずに、集約オブジェクト内の要素に順番にアクセスすることを許可します。

主に解決する問題

  • 異なる集約オブジェクトを走査するための統一された方法を提供します。

使用场景 → 使用シーン

  • 集約オブジェクトを走査する必要があるが、その内部構造を公開したくない場合。

実装方法

  • 定义迭代器接口 → イテレータインターフェースを定義する:包含 → :含むhasNext()とnext()等方法,用于遍历元素。 → などのメソッド。要素を走査するために使用します。
  • 具体的なイテレータを作成する:イテレータインターフェースを実装し、特定の集約オブジェクトをどのように走査するかを定義します。
  • 聚合类 → 集約クラス:イテレータオブジェクトを返すためのインターフェースを定義します。

关键代码 → キーコード

  • 迭代器接口 → イテレータインターフェース:要素を走査するメソッドを規定します。
  • 具体的なイテレータ:イテレータインターフェースを実装し、走査ロジックを含みます。

応用例

  • JavaのIterator → JavaのIterator:Javaコレクションフレームワークのイテレータは、コレクションの要素を走査するために使用されます。

長所

  1. 支持多种遍历方式 → 複数の走査方法をサポート:異なるイテレータは異なる走査方法を定義できます。
  2. 简化聚合类 → 集約クラスの簡素化:聚合类不需要关心遍历逻辑。 → :集約クラスは走査ロジックを考慮する必要がありません。
  3. 多遍历支持 → 複数走査のサポート:同じ集約オブジェクトを同時に複数回走査できます。
  4. 拡張性:新しい集約クラスとイテレータクラスの追加が容易で、既存のコードを変更する必要がありません。

短所

  • 系统复杂性 → システムの複雑性:集約クラスを追加するたびに対応するイテレータクラスを追加する必要があり、クラスの数が増加します。

使用建议 → 使用上のアドバイス

  • 集約オブジェクトの内容にアクセスする必要があり、その内部表現を公開したくない場合は、イテレータパターンを使用します。
  • 集約オブジェクトに複数の走査方法を提供する必要がある場合は、イテレータパターンの使用を検討します。

注意事項

  • イテレータパターンは、コレクションオブジェクトの走査動作を分離することで、外部コードがコレクションの内部構造を公開せずに、コレクション内部のデータに透過のにアクセスできるようにします。

構造

迭代器模式包含以下几个主要角色: → イテレータパターンには、以下の主要な役割が含まれます:

  • 迭代器接口(Iterator) → イテレータインターフェース(Iterator):集約オブジェクト内の各要素にアクセスおよび走査するメソッドを定義します。通常、次の要素を取得する、要素がまだあるかどうかを判断する、現在位置を取得するなどのメソッドが含まれます。

  • 具体的なイテレータ(Concrete Iterator):イテレータインターフェースを実装し、集約オブジェクトの走査とアクセスを担当し、走査の現在位置を記録します。

  • 集約オブジェクトインターフェース(Aggregate):イテレータオブジェクトを作成するためのインターフェースを定義します。通常、イテレータオブジェクトを作成するためのファクトリメソッドが含まれます。

  • 具体的な集約オブジェクト(Concrete Aggregate) → 具体的な集約オブジェクト(Concrete Aggregate):集約オブジェクトインターフェースを実装し、具体的なイテレータオブジェクトの作成を担当し、走査が必要なデータを提供します。 → :集約オブジェクトインターフェースを実装し、具体的なイテレータオブジェクトを作成し、走査に必要なデータを提供します。

実装

ナビゲーション方法を説明するものを作成します。Iteratorインターフェースと、イテレータを返すContainerインターフェース。実装したContainerインターフェースのエンティティクラスが実装を担当しますIterator接口。 → インターフェース。

IteratorPatternDemo、私たちのデモクラスはエンティティクラスを使用しますNamesRepository来打印 → を使用して印刷しますNamesRepositoryにコレクションとして格納されているNames。

迭代器模式的 UML 图

步骤 1 → ステップ 1

创建接口: → インターフェースを作成:

Iterator.java

public interface Iterator { public boolean hasNext(); public Object next(); }

Container.java

public interface Container { public Iterator getIterator(); }

步骤 2 → ステップ 2

実装したものを作成Containerインターフェースのエンティティクラス。このクラスには実装したIteratorインターフェースの内部クラスがありますNameIterator。

NameRepository.java

public class NameRepository implements Container { public String[] names = {"Robert" , "John" ,"Julie" , "Lora"}; @Override public Iterator getIterator() { return new NameIterator(); } private class NameIterator implements Iterator { int index; @Override public boolean hasNext() { if(index < names.length){ return true; } return false; } @Override public Object next() { if(this.hasNext()){ return names[index++]; } return null; } } }

步骤 3 → ステップ 3

使用 → 使用してNameRepository来获取迭代器,并打印名字。 → イテレータを取得し、名前を印刷します。

IteratorPatternDemo.java

public class IteratorPatternDemo { public static void main(String[] args) { NameRepository namesRepository = new NameRepository(); for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){ String name = (String)iter.next(); System.out.println("Name : " + name); } } }

步骤 4 → ステップ 4

执行程序,输出结果: → プログラムを実行し、結果を出力:

Name : Robert
Name : John
Name : Julie
Name : Lora
其他扩展 → その他の拡張