イテレータパターンの構造:
反復サブパターンは、集約された内部表現を公開せずに、集約された要素に順番にアクセスできます。
反復剤は、外部反復剤および内部反復剤に分けることができます。
外部イテレータ:ホワイトボックスの集約に適しています(ホワイトボックスの集約は、内部要素インターフェイスにアクセスする集約を外の世界に提供することです)。反復ロジックは集約オブジェクト自体によって提供されるため、そのような外部イテレーターサブロールは、多くの場合、反復剤のカーソル位置のみを維持することがよくあります。したがって、特定の反復サブロールは外部クラスであり、そのコンストラクターは特定の集計オブジェクトを受け入れるため、この集約オブジェクトの反復ロジックを呼び出すことができます。
内側のイテレーター:ブラックボックスの集約に適しています(ブラックボックスの集約は、外側へのインターフェイスを提供して、独自の要素オブジェクトを横断しません)。ブラックボックスで収集された要素オブジェクトは、集約された内部メンバーによってのみアクセスできるため、内側のイテレーターは集約内のメンバーのサブクラスにのみ存在できます。
簡単なデモンストレーション:
パッケージtest.edu.inter; public interface iteratorobj { / ***最初の要素に移動* / public void first(); / ***次の要素に移動*/ public boolean hasNextItem(); / ***現在の要素を返します*/ public Object currentItem(); }パッケージtest.edu.inter; public interface dataset {public iteratorobj getiterator(); }パッケージtest.edu.inter; public class iterator1 Iteratorobj {private dataobj set;プライベートINTサイズ。 Private int index = 0; public Iterator1(dataObj set){this.set = set; this.size = set.getSize(); } @Override public void first(){// todo auto-enerated method stub this.index = 0; } @Override public boolean hasnextItem(){if(index <size){return true; } falseを返します。 } @Override public object culernitem(){object ob = set.getItem(index); if(index <size){index ++; } obを返します。 }} package test.edu.inter;パブリッククラスDataOBJはデータセットを実装しています{private Object [] objarray = null; / ***入力集約オブジェクト*/ public dataObj(object [] objarray){this.objarray = objarray; } @Override public Iteratorobj getiterator(){return new Iterator1(this); } public Object getItem(int index){return objarray [index]; } public int getsize(){return objarray.length; }} package test.edu.inter;パブリッククラスクライアント{ / ** * @param args * / public static void main(string [] args){// todo auto-fenated method string [] str = {"12312"、 "dasda"、 "dasd"、 "12d"、 "asd"}; dataOBJ ao = new DataOBJ(str); iteratorobj io = ao.getiterator(); while(io.hasnextitem()){system.out.println(io.currentitem()); }}}実行結果:
12312 DASDA DASD 12D ASD
コンテンツの拡張: Java集約のアプリケーション
Iterator()ファクトリメソッドは、java.util.collectionインターフェイスで提供され、イテレーター型オブジェクトを返します。コレクションインターフェイスのサブタイプであるインナーメンバークラスITRは、Iteratorインターフェイスを実装します。そのため、ITRは固有の反復サブクラスですが、AbstractListは独自のトラバーサル方法も提供するため、ブラックボックスの集約ではなく、白いボックスの集約です。コードは次のとおりです。
import java.util.iterator; public interface itr extend iterator {// next()メソッドを再び呼び出すときに使用されるインジケータint cursor = 0; //最後のコールラストレット= -1で使用されるインジケーター; int expectsModCount = modCount; public boolean hasnext(){return cursor!= size(); } public object next(){try {object next = get(cursor); checkforcomodification(); Lastret = cursor ++;次に戻ります。 } catch(indexoutofboundsexception e){checkforcomodification();新しいnosuchelementexception(); }} //最後のトラバース要素を削除すると、remove()メソッドは最後のトラバース要素public void remove()のみを削除できます{if(lastret == -1)throw new legalStateException(); checkforcomodification(); try {abstractlist.this.remove(lastret); if(lastret <cursor)cursor-;ラストレット= -1; expectsModCount = modCount; } catch(indexoutofboundsexception e){新しいconcurrentModificationException(); }} public void checkforcomodification(){if(modcount!= expectsModCount)throw new concurrentModificationException(); }} ModCount、GET(カーソル)などの変数とメソッドはすべてAbstractListクラスが所有しており、ITRは直接使用できます。メソッドCheckForcomodification()は、集約されたコンテンツが外の世界によって直接変更されたばかりであるかどうかを確認します(Iteratorが提供するremove()メソッドを介して変更されていません)。収集されたコンテンツが反復サブオブジェクトによってバイパスされ、反復的サブオブジェクトの後に新年を直接変更した場合、この方法はすぐに例外をスローします。
さらに:AbstractListクラスは、ListIterator()メソッドも提供し、ListIteratorインターフェイスを実装するクラスListITRインスタンスを返します。 Listiteratorインターフェイスは、順方向の反復と逆の反復を実装し、反復プロセス中に列のコンテンツを安全に変更する方法も提供します。
列挙とイテレーターの違い:(1)列挙には除去方法がありません(2)列挙は、ベクトルの要素()メソッドの名前のないクラスとして実装されています。失敗に対して高速な支払いをしません。つまり、反復プロセス中に、集約されたオブジェクトは外の世界によって予期せず変更され、この反復プロセスはすぐに例外をキャッチします。
上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。