まず、イテレータパターン入門
イテレータモードは、モードは、行動パターンの一つである反復と呼ばれ、それは委員会に含まれる内部オブジェクトコンテナであり、クラス外部からのアクセスを与える使用イテレータのためにデザインパターントラバーサル訪問を(横断)。
反復モードの第二に、役割と責任
反復子(イテレータインターフェイス):このインタフェースは、定義されたメソッドの最小セットを提供として反復機能を達成するように定義されなければならないのhasNext()と次の()メソッドを。
ConcreteIterator (イテレータの実装クラス):Iteratorインターフェイスイテレータの実装クラス。これは、状況に応じて実装することができます。
集約(トラップポート):基本的な機能の定義は、同様の提供イテレータイテレータ()メソッドを。
concreteAggregate (コンテナ実装クラス):コンテナインタフェースの実装クラス。私たちは、実装する必要がありますイテレータイテレータ()メソッドを。
第三に、特定のイテレータパターンの実装
そこレストランとマージするパンケーキハウスではあるが、各ボスは、メニューの配列を使用して独自のメニューモード、レストランを利用したい、とパンケーキハウス使って ArrayListのフォームを。
名前実現は同じ形ではなく、各メニュー項目の内容は同じですが、我々はメニューアイテムのデザインを見て、より多くの従来のリストが、この説明、それは菜食主義者であるかどうか、価格:
// Anがブロックを強調しました
パッケージdesign.iterator.gys.noiterator。
公共MenuItemクラス{
文字列の名前。
文字列のDESC;
ブールベジタリアン;
二重価格;
公共のMenuItem(文字列名、文字列のDESC、ブールベジタリアン、二重価格){
スーパー();
this.name =名前;
this.desc = DESC;
this.vegetarian =ベジタリアン。
this.price =価格。
}
パブリック文字列のgetName(){
名前を返します。
}
パブリック文字列getDesc(){
DESCを返します。
}
パブリックブールisVegetarian(){
ベジタリアン返します。
}
公共ダブルgetPrice(){
価格を返します。
}
}
1 、反復モードを使用しないでください
ボス異なる意見を始めて、自分のメニューを変更したくない、我々は、メニューバー2が表示されます。
レストラン:
// Anがブロックを強調しました
パッケージdesign.iterator.gys.noiterator。
パブリッククラスDinnerMenu {
静的最終INT最大= 6。
int型numberOfItem = 0;
MenuItem []メニュー。
パブリックDinnerMenu(){
メニュー=新しいMenuItemの[最大]。
addItem( "A2"、 "B2"、真、6.99);
addItem( "C2"、 "D2"、偽、7.99);
addItem( "E2"、 "F2"、真、8.99);
addItem( "G2"、 "H2"、偽、9.99);
}
公共ボイドのaddItem(文字列名、文字列のDESC、ブールベジタリアン、二重価格){
MenuItemのmt =新しいのMenuItem(名前、DESC、ベジタリアン、価格)。
(numberOfItem> =最大)の場合
System.out.println( "メニューがいっぱいです");
他
{
メニュー[numberOfItem] = MT;
numberOfItem ++;
}
}
公共のMenuItem [] getMenu(){
メニューを返します。
}
}
パンケーキハウス:
// Anがブロックを強調しました
パッケージdesign.iterator.gys.noiterator。
輸入はjava.util.ArrayList;
パブリッククラスPancakeHouseMenu {
ArrayListのメニュー。
パブリックPancakeHouseMenu(){
メニュー=新しいArrayListを();
addItem( "A1"、 "B1"、真、1.99);
addItem( "C1"、 "D1"、偽、2.99);
addItem( "E1"、 "F1"、真、3.99);
addItem( "G1"、 "H1"、偽、4.99);
}
公共ボイドのaddItem(文字列名、文字列のDESC、ブールベジタリアン、二重価格){
MenuItemのmt =新しいのMenuItem(名前、DESC、ベジタリアン、価格)。
menu.add(MT);
}
公共のArrayList getMenu(){
メニューを返します。
}
}
案の定異なるスタイル、ああ、ああ、あまりにも忙しいウェイター、2つのメニューを区別するために、または偶然の愚か者を作るために必要な場合がありました。メニューの最初の形式でなく、同じではありませんを取得するには、ウェイターがそれぞれ反復処理する必要があります両方:
// Anがブロックを強調しました
パッケージdesign.iterator.gys.noiterator。
輸入はjava.util.ArrayList;
パブリッククラスウェイトレス{
プライベートPancakeHouseMenuのMENU1。
プライベートDinnerMenu MENU2。
公共ウェイトレス(PancakeHouseMenu MENU1、DinnerMenu MENU2){
スーパー();
this.menu1 = MENU1。
this.menu2 = MENU2。
}
ます。public void printMenu()
{
ArrayListのbreakfastMenu = menu1.getMenu()。
MenuItem [] lunchMenu = menu2.getMenu()。
System.out.println( "*** PancakeHouseMenu ***");
以下のために(int型私= 0;私はbreakfastMenu.sizeを()<;私は++)
{
MenuItem MT =(のMenuItem)breakfastMenu.get(I);
System.out.println(mt.getName()+ " "+ mt.getDesc()+"" + mt.getPrice())。
}
System.out.println( "*** DinnerMenu ***");
(!;私はlunchMenu.length && lunchMenu [i]は=ヌルを<;私は++ iの0 = INT)について
{
MenuItemのmt = lunchMenu [i]は、
System.out.println(mt.getName()+ " "+ mt.getDesc()+"" + mt.getPrice())。
}
}
}
レストランの動作を見てみましょう:
// Anがブロックを強調しました
パッケージdesign.iterator.gys.noiterator。
パブリッククラスTest {
パブリック静的無効メイン(文字列[] args){
// TODO自動生成されたメソッドスタブ
PancakeHouseMenu M =新PancakeHouseMenu()。
DinnerMenuさd =新しいDinnerMenu();
新しいウェイトレス(M、D)= Wウェイトレス。
w.printMenu();
}
}
// Anがブロックを強調しました
*** *** PancakeHouseMenu
A1、B1 1.99
C1 D1を2.99
E1のF1 3.99
G1 H1 4.99
*** *** DinnerMenu
A2 B2を6.99
C2 D2を7.99
E2 f2を8.99
G2 H2 9.99
まあ、それはすべての主要な問題のうち、ウェイターは、専用Aのために考慮することができます。
質問があるので、ウェイターが横断するために2サイクルを要する外国為替リベートただし、メニュー項目、より多くの機能にバンドルメニュー、スタッフ、および特定を展開することができず、二つの内部メニューが完全にウェイターにさらさ我々は彼が悪い奴だと思いたいが、それだけの場合ではありません。
2 反復モードを使用して、
デザイン
クラス設計
彼女は一つのインタフェースを持つ唯一の馴染みのすべてのメニューを印刷することができますので、作業アテンダントを低減するために。
まず、抽象イテレータクラスは、まだメニュー変更の内容を調理するために左に、そしてここでは、自己定義のイテレータ形式を使用します。
// Anがブロックを強調しました
パッケージdesign.iterator.gys.iterator。
パブリックインターフェイスイテレータ{
パブリックブールのhasNext();
パブリックオブジェクトの次の();
}
メニューは、配列型であり、我々は配列インデックスを使用するため、ここでレストラン反復子は、固定長の配列であるように、設計された、我々は唯一の指標は、配列の内容が空であるかどうかを決定超えるかどうかを判断してはならない、です。
// Anがブロックを強調しました
パッケージdesign.iterator.gys.iterator。
輸入design.iterator.gys.noiterator.MenuItem。
パブリッククラスDinnerMenuIteratorは{Iteratorを実装します
民間のMenuItem []メニュー。
プライベートint型開始= 0;
公共DinnerMenuIterator(MenuItemの[]メニュー){
スーパー();
this.menu =メニュー。
}
@オーバーライド
パブリックブールのhasNext(){
// TODO自動生成されたメソッドスタブ
場合(開始<menu.length &&メニューは、[スタート]!= NULL)
trueを返します。
他
falseを返します。
}
@オーバーライド
次のパブリックオブジェクト(){
// TODO自動生成されたメソッドスタブ
メニューに戻る[++スタート];
}
}
パンケーキハウスメニュー使用 ArrlyList 実装、可変長の所属します:
// Anがブロックを強調しました
パッケージdesign.iterator.gys.iterator。
輸入はjava.util.ArrayList;
パブリッククラスPancakeHouseMenuIteratorは{Iteratorを実装します
プライベートArrayListのメニュー。
プライベートint型開始= 0;
公共PancakeHouseMenuIterator(ArrayListのメニュー){
スーパー();
this.menu =メニュー。
}
@オーバーライド
パブリックブールのhasNext(){
// TODO自動生成されたメソッドスタブ
もし(開始<menu.size())
trueを返します。
他
falseを返します。
}
@オーバーライド
次のパブリックオブジェクト(){
// TODO自動生成されたメソッドスタブ
(++スタート)menu.getを返します。
}
}
この時点で、私たちは、イテレータに2つのメニューを実現しました。それでは、私たちはウェイターはイテレータを取得できるようにするために、メニュー内で処理する必要があります。
レストラン:
// Anがブロックを強調しました
パッケージdesign.iterator.gys.iterator。
輸入design.iterator.gys.noiterator.MenuItem。
パブリッククラスDinnerMenu {
静的最終INT最大= 6。
int型numberOfItem = 0;
MenuItem []メニュー。
パブリックDinnerMenu(){
メニュー=新しいMenuItemの[最大]。
addItem( "A2"、 "B2"、真、6.99);
addItem( "C2"、 "D2"、偽、7.99);
addItem( "E2"、 "F2"、真、8.99);
addItem( "G2"、 "H2"、偽、9.99);
}
公共ボイドのaddItem(文字列名、文字列のDESC、ブールベジタリアン、二重価格){
MenuItemのmt =新しいのMenuItem(名前、DESC、ベジタリアン、価格)。
(numberOfItem> =最大)の場合
System.out.println( "メニューがいっぱいです");
他
{
メニュー[numberOfItem] = MT;
numberOfItem ++;
}
}
公共イテレータcreateIterator(){
新しいDinnerMenuIterator(メニュー)を返します。
}
}
パンケーキハウス:
// Anがブロックを強調しました
パッケージdesign.iterator.gys.iterator。
輸入はjava.util.ArrayList;
輸入design.iterator.gys.noiterator.MenuItem。
パブリッククラスPancakeHouseMenu {
ArrayListのメニュー。
パブリックPancakeHouseMenu(){
メニュー=新しいArrayListを();
addItem( "A1"、 "B1"、真、1.99);
addItem( "C1"、 "D1"、偽、2.99);
addItem( "E1"、 "F1"、真、3.99);
addItem( "G1"、 "H1"、偽、4.99);
}
公共ボイドのaddItem(文字列名、文字列のDESC、ブールベジタリアン、二重価格){
MenuItemのmt =新しいのMenuItem(名前、DESC、ベジタリアン、価格)。
menu.add(MT);
}
公共イテレータcreateIterator(){
新しいPancakeHouseMenuIterator(メニュー)を返します。
}
}
新しいスタッフに適応する方法を見てください:
// Anがブロックを強調しました
パッケージdesign.iterator.gys.iterator。
輸入design.iterator.gys.noiterator.MenuItem。
パブリッククラスウェイトレス{
PancakeHouseMenu MENU1。
DinnerMenuのmemu2。
公共ウェイトレス(PancakeHouseMenu MENU1、DinnerMenu memu2){
スーパー();
this.menu1 = MENU1。
this.memu2 = memu2。
}
ます。public void printMenu(){
イテレータI1 = menu1.createIterator()。
printMenu(I1)。
System.out.println( "----------");
イテレータI2 = memu2.createIterator()。
printMenu(I2)。
}
公共のボイドprintMenu(イテレータイテレータ)
{
一方、(iterator.hasNext()){
MenuItem M =(のMenuItem)iterator.next();
System.out.println(m.getName()+ " "+ m.getDesc()+"" + m.getPrice())。
}
}
}
だから、簡単に!今ウェイターはちょうどあなたがメニューの横断を達成することができ、あなたは内部機構の実装を知っている必要はありませんでした、各メニューイテレータを呼び出す必要があります。
// Anがブロックを強調しました
パッケージdesign.iterator.gys.iterator。
パブリッククラスTsetの{
パブリック静的無効メイン(文字列[] args){
// TODO自動生成されたメソッドスタブ
PancakeHouseMenu P =新しいPancakeHouseMenu();
DinnerMenuさd =新しいDinnerMenu();
新しいウェイトレス(P、D)= Wウェイトレス。
w.printMenu();
System.out.println( "**********");
反復子I = d.createIterator()。
w.printMenu(I);
}
}
テスト結果:
// Anがブロックを強調しました
A1、B1 1.99
C1 D1を2.99
E1のF1 3.99
G1 H1 4.99
----------
A2 B2を6.99
C2 D2を7.99
E2 f2を8.99
G2 H2 9.99
**********
A2 B2を6.99
C2 D2を7.99
E2 f2を8.99
G2 H2 9.99
良好な結果は、メニューの出力に単独で使用することができます。
----------------
オリジナルリンク: https://blog.csdn.net/qq_22118991/article/details/84968047