23デザインパターン、第14章:Java Iteratorパターン
定義:オブジェクトの内部詳細を公開せずに、コンテナオブジェクト内のさまざまな要素にアクセスする方法を提供します。
タイプ:行動パターン
クラス図:
Javaで最も一般的に使用されるモードを尋ねたい場合、答えはSingletonモードでも、工場モードでも、戦略モードではなく、イテレーターモードではありません。最初にコードを見てみましょう。
public static void print(collection coll){iterator it = coll.iterator(); while(it.hasnext()){string str =(string)it.next(); System.out.println(str); }}この方法の機能は、文字列コレクションループを印刷することであり、イテレーターパターンはイテレータパターンで使用されます。 Java言語は、Iteratorパターンを完全に実装しています。中国語に翻訳されたイテレーターは、イテレーターを意味します。反復因子に関しては、まず第一に、それはセットに関連しています。セットは、集合体、コンテナなどとも呼ばれます。セットをオブジェクトを含むコンテナと見なすことができます。たとえば、リスト、セット、マップ、さらには配列もセットと呼ぶことができます。イテレーターの機能は、コンテナ内のオブジェクトを1つずつ通過することです。
イテレータパターンの構造
要約コンテナ:一般に、Javaのコレクションインターフェイス、リストインターフェイス、セットインターフェイスなど、Iterator()メソッドが提供されます。
特定のコンテナ:アレイリストを実装するリストインターフェイスの順序付けリスト、リンクリストのリンクリストインターフェイスのリンクリスト、ハッシュセットを実装するためのセットインターフェイスのハッシュリストなど、抽象コンテナの具体的な実装クラスです。
抽象イテレータ:要素を通過するために必要な方法を定義します。一般的に言えば、3つの方法があります。最初の要素の最初の()メソッドを取得し、次の要素の次の()メソッドを取得し、トラバーサル終了の方法が現在のオブジェクトの(またはhasnext())、remove()の方法を決定します。
Iteratorの実装:コレクションの反復を完了するために、Iteratorインターフェイスで定義された方法を実装します。
コード実装
Interface Iterator {public Object next(); public boolean hasnext(); } class concreteteateratorはiteratorを実装します{プライベートリスト= new arrayList(); private int cursor = 0; public Concreteiterator(リストリスト){this.list = list; } public boolean hasnext(){if(cursor == list.size()){return false; } trueを返します。 } public Object next(){object obj = null; if(this.hasnext()){obj = this.list.get(cursor ++); } objを返します。 }} interface aggregate {public void add(object obj); public void remove(オブジェクトobj); public Iterator Iterator(); }クラスconcreteaggregate aggregate {private list list = new ArrayList(); public void add(object obj){list.add(obj); } public Iterator iterator(){return new Concreteteator(list); } public void remove(object obj){list.remove(obj); }} public class client {public static void main(string [] args){aggregate ag = new concreteaggregate(); Ag.Add( "Xiaoming"); Ag.Add( "Xiaohong"); Ag.Add( "Xiaogang"); iterator it = ag.iterator(); while(it.hasnext()){string str =(string)it.next(); System.out.println(str); }}}上記のコードでは、集計はコンテナクラスインターフェイスです。コレクション、リスト、セットなどを想像できます。Aggregateは簡素化されたバージョンです。コンテナクラスインターフェイスには3つの主なメソッドがあります。オブジェクトメソッドの追加追加、オブジェクトメソッドの削除、およびイテレータメソッドイテレータを取得します。 Iteratorは、2つの主な方法があるIteratorインターフェイスです。次に反復オブジェクトメソッドを取得し、メソッドHasNextを反復するかどうかを決定します。 java.util.listとjava.util.iteratorの2つのインターフェイスを比較して、自分で考えることができます。
イテレータモードの利点:
トラバーサル法は簡素化されており、オブジェクトコレクションを横断することはまだ非常に厄介です。配列または注文されたリストの場合でも、カーソルを介してそれらを取得できますが、ユーザーはコレクションを明確に理解しているという前提で、自分でオブジェクトを通過する必要があります。ただし、ハッシュテーブルの場合、ユーザーを横断する方が面倒です。 Iteratorメソッドを導入した後、ユーザーが使用しやすくなります。
順序付けられたリストの場合、2つの反復器に、ニーズに応じてプラスの順序と逆方向の順序トラバーサルを提供するなど、多くの方法があります。ユーザーは、コレクションを簡単にトラバースするために実装したイテレーターを取得する必要があります。
カプセル化は良好であり、ユーザーは反復因子をトラバースするだけで済む必要がありますが、横断アルゴリズムを心配する必要はありません。
イテレータパターンの短所:
単純なトラバーサル(配列や順序付けされたリストなど)の場合、イテレーターを使用する方が面倒で、ArrayListのように、ループに使用し、コレクションを通過する方法を取得すると感じるかもしれません。
イテレータモードに適用されるシナリオ
イテレーターパターンは、コレクションとの共生と死です。一般的に言えば、コレクションを実装する限り、コレクション、リスト、セット、マップなどと同様に、コレクションのイテレーターを同時に提供する必要があります。これらのコレクションには独自のイテレーターがあります。このような新しいコンテナを実装したい場合は、もちろん、容器用のイテレーターを実装するためのイテレーターパターンを導入する必要もあります。
ただし、コンテナとイテレーターの関係は近すぎるため、ほとんどの言語はコンテナを実装するときにイテレーターを提供し、これらの言語が提供するコンテナとイテレーターはほとんどの場合、私たちのニーズを満たすことができます。したがって、イテレーターパターンを自分で練習することは比較的まれです。言語で既存のコンテナとイテレーターを使用する必要があります。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。