まず、イテレータパターンは何ですか
それは、製品開発の本質でない限り、イテレータ言葉は、Java、コレクションをトラバースするために使用するJavaのイテレータイテレータに出演していたが、イテレータパターンは衰退のパターンであって、事実上、誰もが、一人でイテレータを書かないでしょう。
反復モード(イテレータ)は、オブジェクト表現の内部を露出させることなく、各オブジェクト要素の逐次重合にアクセスするための方法が提供されます。次のようにUMLの構造は次のとおりです。
集計は、抽象クラスを集めさせ、それがインターフェイスを作成するために、具体的なイテレータの役割を提供する責任があり、イテレータイテレータは抽象オブジェクトなど、統一されたインタフェースの現在の方法を終了するか否かを判断するために次のオブジェクトを取得するには、スタートを取得するためにオブジェクトを定義する抽象クラスです。 ConcreteAggregate骨材コンクリート骨材継承するクラス。ConcreteIterator特定のイテレータクラス、反復子の連続は、次の、達成始まり、現在のオブジェクトなどの終わりかどうか。
1.抽象コンテナ
そのようなそのような方法の類似createIteratorように、インターフェースを提供する責任がある()一般イテレータ()メソッドは、Javaで存在します。
1つの パブリック インターフェイス集合{ 2 3 公共 ボイド追加(Objectオブジェクト)。 4 5 公共 ボイド削除(Objectオブジェクト)。 6 7 公共イテレータイテレータ()。 8 9 }
2.抽象イテレータ
アクセスとインターフェイスを定義する責任要素を横断する、固定の3つの方法()の最初の要素を取得し、次の()の要素にアクセスする、のhasNext()が既に端部にトラバースされる最初の、即ち、基本的にあります。
1 パブリック インターフェイスイテレータ{ 2 3。 公的オブジェクト次に(); // 次の要素に反復 4。 5。 パブリック ブールのhasNext(); // 端に横断した場合 6。 7。 パブリック ブール削除(); // 現在指す要素を削除 8 。9 }
3. 具体容器
1 パブリック クラス ConcreteAggregateが実装集合{ 2 3 プライベートベクトルベクトル= 新しいベクトル(); 4 5 @Override 6 公共 ボイド追加(Objectオブジェクト){ 7 この.vector.add(オブジェクト)。 8 } 9 10 公共 ボイド削除(Objectオブジェクト){ 11 この.remove(オブジェクト)。 12 } 13 14 @Override 15 公共イテレータイテレータ(){ 16 リターン 新しい ConcreteIterator(この.vector)。 17 } 18 19 }
4.詳細なイテレータ
シンプルな実装では、カーソルを介して行われ、容器の中に上下に転がし、それを見るために必要なすべての要素をトラバースします。
1 パブリック クラス ConcreteIteratorが実装イテレータ{ 2 3 プライベートベクトルベクトル= 新しいベクトル(); 4 公共 int型のカーソル= 0。 // 定义当前游标 5 6 公共ConcreteIterator(ベクトルベクトル){ 7 この .vector = ベクター。 8 } 9 10 @Override 11 公的オブジェクトの次の(){ 12 オブジェクト結果= NULL ; 13 14 であれば(この.hasNext()){ 15 結果= この .vector.get(この .CURSOR ++ )。 16 } 他{ 17 結果= NULL ; 18 } 19 20 リターン結果。 21 } 22 23 @Override 24 パブリック ブールのhasNext(){ 25 であれば(この .CURSOR == この.vector.size()){ 26 リターン 偽。 27 } 28 29 リターン 真。 30 } 31 32 @Override 33 公共 ブール削除(){ 34 この .vector.remove(この.CURSOR)。 35 36 リターン 真。 37 } 38 39 }
5.クライアントクライアント
次のテストでは、カスタムイテレータクラスの導入ではなく、パッケージ化されたJavaのIteratorクラスに注意を払います。
1つの パブリック クラスクライアント{ 2 3 公共 静的 ボイドメイン(文字列[]引数){ 4 集計集計= 新しいConcreteAggregate()。 5 aggregate.add( "ABC" )。 6 aggregate.add( "AAA" )。 7 aggregate.add( "1234" )。 8 9 // 遍历 10 イテレータイテレータ= aggregate.iterator()。 11 一方(iterator.hasNext()){ 12 のSystem.out.println(iterator.next())。 13 } 14 } 15 16 }
結果は以下の通りであります:
反復モードの第二に、アプリケーション
1.使用します
- 集約オブジェクトが通過するとき
2.方法
- イテレータではなく、集約オブジェクトへの散歩の要素間の責任
3.利点
- サポート別の方法集約オブジェクトを移動します
- イテレータクラスは、重合を簡素化
- 同じ重合でトラバースを複数有していてもよいです
- 既存のコードを変更することなく、高分子イテレータクラスと簡単に新しいクラスを追加します。
4.欠点
- これは、システムの複雑さを増すことになります。新しいクラスイテレータクラスの対応する増加の新たな重合の必要性を増加させるデータを介して職務の分離反復モードと格納データ、ので、システムの複雑さを増大させます。
5.使用シナリオ
- 場合その内部表現を公開せず、集約オブジェクトのコンテンツにアクセスします
- 必要性は、オブジェクトを集約するのに便利なさまざまな方法を提供した場合
- 統一されたインタフェースを提供するために、異なるポリマー構造を横断
6.応用例
- Javaのイテレータイテレータ
- foreachのトラバーサル
第三に、イテレータパターンを達成するために
この部分は繰り返さず、特定の実装は上記のコードではあまり差はないが、特定のアプリケーションシナリオに応じて変えることができ、もちろん、するjava.util.Iteratorソースを読み取ります。
導入上のこの一般的な23個のデザインパターンは、すべてがクラウドにアップロードされたソースコードを切り替えて、終わって、新モデルの拡張(通常の23個のデザインパターンを超えたデザインパターン)として、フォローアップをする機会があり、短い時間で更新され続けますもはやデザインパターンについて書くことに満足。
ます。https://www.cnblogs.com/adamjwh/p/11024311.htmlで再現