イテレータパターン


反復子パターンは、Java および .Net プログラミング環境で非常に一般的に使用される設計パターンです。このパターンは、コレクション オブジェクトの基礎となる表現を知らなくても、コレクション オブジェクトの要素に順番にアクセスするために使用されます。

イテレータ パターンは動作パターンです。

はじめに

目的: オブジェクトの内部表現を公開せずに、集合オブジェクト内の個々の要素に順次アクセスするメソッドを提供します。

主な解決策: 統合オブジェクト全体を横断するさまざまな方法。

いつ使用するか: 集合オブジェクトを走査します。

解決方法: 要素間を移動する責任を、集約オブジェクトではなくイテレーターに置きます。

キーコード: 定義インターフェース: hasNext、next。

アプリケーション例: JAVA の イテレータ。

利点: 1. さまざまな方法での集合オブジェクトの走査をサポートします。 2. イテレータは集約クラスを簡素化します。 3. 同じ集合体上で複数の走査が存在する可能性があります。 4. イテレータ モードでは、元のコードを変更せずに新しい集約クラスとイテレータ クラスを追加するのに非常に便利です。

短所: 反復子パターンはデータの保存とデータの走査の責任を分離するため、新しい集約クラスを追加するには、新しい反復子クラスを追加する必要があり、クラスの数がペアで増加し、システムの複雑さがある程度増加します。複雑。

使用シナリオ: 1. 内部表現を公開せずに集合オブジェクトの内容にアクセスします。 2. 集約オブジェクトに対して複数のトラバーサル メソッドを提供する必要があります。 3. さまざまな集合構造を横断するための統一インターフェイスを提供します。

注: イテレータ パターンは、コレクション オブジェクトのトラバース動作を分離し、担当するイテレータ クラスを抽象化します。これにより、コレクションの内部構造は公開されず、外部コードはコレクションの内部に透過的にアクセスできます。データ。

実装

ナビゲーションメソッドを記述するIteratorインターフェースとイテレータを返すContainerインターフェースを作成します。 Container インターフェースを実装するエンティティ クラスは、Iterator インターフェースの実装を担当します。

IteratorPatternDemo のデモ クラスは、エンティティ クラス NamesRepository を使用して、NamesRepository にコレクションとして保存されている Names を出力します。

iterator_pattern_uml_diagram.jpg

ステップ 1

インターフェースを作成します。

Iterator.java

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

Container.java

public interface Container {
   public Iterator getIterator();
}

ステップ 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

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

出力を確認します。

りー