I.概要
集合オブジェクトではなくオブジェクト表現の内部を露出させることなく、各素子への順次アクセスを提供する方法。
イテレータパターンは、オブジェクトのトラバーサル挙動コレクションの分離である、抽象イテレータクラスは、両方のコレクションの内部構造を露出することなく行うことができるように、責任があるだけでなく、内部のデータ収集に外部コード透過的なアクセスを可能にします。
反復モードは、JDKのコレクションはまた、イテレータの具体的な実現を提供し、以下を使用して直接使用することができ、自分自身を理解していません
1.1アプリケーションのシナリオ
図1に示すように、その内部表現を公開せず、ポリマーコンテンツオブジェクトへのアクセス。
2、高分子体を提供するために様々な方法を横断する必要があります。
図3は、異なるポリマー構造を横断するための均一なインタフェースを提供します。
1.2、長所と短所
利点: 1、集約オブジェクトを通過する別の方法をサポートしています。2、重合イテレータクラスを単純化します。図3は、同じ重合でトラバースを複数有していてもよいです。図4は、反復モードでは、既存のコードを変更することなく、重合イテレータクラスと容易の新しいクラスを追加します。
短所:によりデータを介して業務反復モードと格納データの分離に、新しいクラスを追加することは、ある程度、システムの複雑さを増加させる新しい重合イテレータクラスの対応する増加、ペア増加のクラスの数を、必要とします。
1.3、クラス図の役割と責任
反復モードの役割と責任
。1、イテレータ(イテレータインターフェース):
反復機能を実装しなければならないインタフェースが定義されたメソッドの最小セットを定義します
そのようなのhasNext()とnext()メソッドを提供します。
2、ConcreteIterator (イテレータの実装クラス):
イテレータイテレータインターフェイスの実装クラス。これは、状況に応じて実装することができます。
。3、集約(トラップポート):
基本的な機能を定義した方法は、同様のイテレータイテレータ()Aを提供します。
。4、concreteAggregate (コンテナの実装クラス):
コンテナインタフェースの実装クラス。私たちは、イテレータイテレータ()メソッドを実装する必要があります。
1.4進化
1.4.1初期化
ブックは、コンテナに格納されるコンテンツを作成します
パブリック クラス帳{ プライベート文字列ID; プライベート文字列名; プライベート ダブル価格。 公共ブック(文字列ID、文字列名、ダブル価格){ この .ID = ID; この .nameの= 名前; この .price = 価格。 } パブリック文字列のgetId(){ 戻りID。 } 公共 ボイドSETID(文字列ID){ この .ID = ID。 } パブリック文字列のgetName(){ 返す名前を。 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } 公共 ダブルgetPrice(){ 戻り価格。 } 公共 ボイド setPrice(二重価格){ この .price = 価格。 } 公共 ボイドディスプレイ(){ System.out.printlnは( "ID =" + ID + "\ TNAME =" +名+ "\ tprice" + 価格)。 } }
コンテナのブックリストを作成します。
パブリック クラスブックリスト{ // 内側容器がリストされ、配列を使用することも可能で プライベートリスト<ブック> =ブックリストの新しい新しいのArrayList <ブック> (); プライベート int型のインデックス; // 本を追加 公共 のボイドaddBook(ブックブック){ bookList.add (書籍); } // 書籍を削除 公共 ボイドremoveBook(本帳){ int型 bookIndex = bookList.indexOf(ブック); bookList.remove(bookIndex); } //は、次の本かどうかを決定する パブリック ブールのhasNext(){ IF(インデックス> =bookList.size()){ 返す falseに; } リターン をtrueに; } // 次の本を取得 公衆ブックgetNextをを(){ 返す bookList.get(インデックス++を); } // コレクションの長さを取得する 公共 int型)のgetSizeを({ 返すブックリストを.size(); } // インデックス帳取得 公共ブックgetByIndex(int型のインデックス){ 返すbookList.get(インデックス); } }
次に、反復コンテナです
モード1(コンテナ自体によって達成トラバーサルの順序。コンテナクラスに直接直接添加順序トラバーサル法)
@Test 公共 ボイドTEST1(){ ブックリストブックリスト = 新しいブックリスト(); BOOK1ブック = 新しいブック( "001"、 "设计模式"、200 ); ブックBOOK2 = 新しいブック( "002"、 "Javaの核心编程"、200 ); ブックBOOK3 = 新しいブック( "003"、 "计算机组成原理"、200 ); bookList.addBook(BOOK1)。 bookList.addBook(BOOK2)。 bookList.addBook(BOOK3)。 一方、(bookList.hasNext()){ ブックブック = bookList.getNext()。 book.display();
輸出
ID = 001、名前=デザインパターン、price200.0 ID = 002、名前= Javaプログラミングのコア、price200.0 ID = 003、名前=コンピュータ組成原理、price200.0
第二の方法、呼び出し側自身トラバーサルをしましょう。直接外部のデータにさらさ詳細)
@Test 公共 ボイドTEST2(){ ブックリストブックリスト = 新しいブックリスト(); BOOK1ブック = 新しいブック( "001"、 "设计模式"、200 ); ブックBOOK2 = 新しいブック( "002"、 "Javaの核心编程"、200 ); ブックBOOK3 = 新しいブック( "003"、 "计算机组成原理"、200 ); bookList.addBook(BOOK1)。 bookList.addBook(BOOK2)。 bookList.addBook(BOOK3)。 以下のために(int型私= 0;私はbookList.getSize()<;私は++を){ ブックブック =bookList.getByIndex(I); book.display(); } }
上記の結果
反復モードを使用していないことの欠点
方法上記の方法1及び2を横切るように実装することができるが、これらの問題
1は、コンテナクラスは、あまりにも多くの機能を引き受けた:一方では自分自身を追加または削除するには、適切な機能を提供する必要性が、一方で横断するためにアクセスを提供する必要があります。
図2に示すように、トラバースを実施する過程において、多くの場合、容器は、そのような混合追加および削除要素、などの機能で簡単に混乱し、実行エラーを引き起こすことができるときの状態を保存する必要が横切ります。
反復モードを適用条件
イテレータパターンを効率的に順次簡潔には横断デザインパターンにアクセスするための移行を処理することで、イテレータモードが効率的な方法を提供し、実装の詳細は、オブジェクトのセット集約コンテナクラスを遮蔽することができるが、コンテナを含むことができ効果的なアクセスのためにオブジェクト要素が順番に横断します。
次の条件が満たされているように、アプリケーションシナリオのイテレータモードをまとめることができます。
図1に示すように、容器内に含まれる内部オブジェクトへのアクセス
にアクセスするために2、
1.4.2、進化
反復モードについてのコードで実装、あなたは単にブックリスト、BookListIteratorを変更することができます
パブリック クラスBookListIterator { // 内側容器がリストされ、配列を使用することも可能で プライベートリスト<ブック> =ブックリストの新しい新しいのArrayList <ブック> (); プライベート int型のインデックス; // 本を追加 公共 のボイドaddBook(ブックブック){ bookList.add (書籍); } // ブックス削除 、公開 のボイドremoveBook(書籍帳){ int型 bookIndex = bookList.indexOf(本を); bookList.remove(bookIndex); } // コレクションの長さを取得 公共の int型のgetSize(){ リターンをbookList.size(); } // インデックス帳取得 公共ブックgetByIndex(int型のインデックスを){ 返すbookList.get(インデックス); } // イテレータを取得 公共イテレータイテレータ(){ 返す 新しい新)のITR(; } // 内部クラス、イテレータのインスタンス(による内部情報のコンテナを使用するには、それは内部クラスを書き換えるべき) プライベート クラスを ITR 実装するIterator { // に次の本、のhasNext()だけコピーした内容があるか否かを判断する パブリック ブールのhasNextが(){ IF(インデックス> = bookList.size()){ リターン 偽; } リターン をtrueに; } // 次の本は、getNextを()だけに内容をコピーします取得 公共次(オブジェクト){ 返す bookList.get(インデックス++を); } 公共の 無効(){削除]を } } }
テスト
@Test 公共 ボイドTEST3(){ BookListIteratorブックリスト = 新しいBookListIterator()。 BOOK1ブック = 新しいブック( "001"、 "设计模式"、200 ); ブックBOOK2 = 新しいブック( "002"、 "Javaの核心编程"、200 ); ブックBOOK3 = 新しいブック( "003"、 "计算机组成原理"、200 ); bookList.addBook(BOOK1)。 bookList.addBook(BOOK2)。 bookList.addBook(BOOK3)。 イテレータイテレータ = bookList.Iterator()。 一方、(iterator.hasNext()){ ブックブック = (書籍)iterator.next(); book.display(); } }
同上出力
私たちは、イテレータとまったく同じJDKのコレクションでこのメソッドの使用を見ることができます。
第二に、拡張
2.1 JDK
java.util.Iteratorの
java.util.ArrayListの中的Itrは
2.2 MyBatisの
org.apache.ibatis.cursor.defaults.DefaultCursor的cursorIterator
C