デザインパターントゥエンティ:イテレータ(イテレータ)

現実の生活だけでなく、プログラミングでは、多くの場合、「のような高分子オブジェクトの様々な要素、訪問データ構造のリンクリストトラバーサルを作成する一般的な方法でリンクされたリストトラバーサル」をして、同じクラスに入れられますが、この方法は、あなたがトラバーサルのメソッドを置き換える場合に反して、ソースコード、変更する必要があり、拡張子に助長されていません「開閉の原則を。」

パッケージには、重合トラバーサルメソッドのクラスに望ましくないので、この方法は、重合クラスを提供していない横断し、横断方法はユーザー自身の作品で実装しましたか?このアプローチの2つの欠点があるだろうので答えは、同じように望ましくありません。

  1. このクラスは、データが安全でないように、重合の内部表現を公開します。
  2. 顧客の負担を増やします。


「反復モード」は、上記の欠点を克服することができ、それは、集約オブジェクトとそのトラバーサル挙動を分離するクライアント・アクセス・イテレータクラス型重合の間に挿入され、顧客は、その内部の詳細を隠し、そして満足「単責任の原則「と」開閉の原理は、「のような  Javaの  コレクション、リスト、セット、マップにあるので、イテレータが含まれています。

モデルの定義と特性

シーケンシャルアクセスデータオブジェクト重合、オブジェクトの内部表現を公開せず、重合のシリーズを提供することを目的とする:イテレータ(反復子)モードを定義します。反復子は、オブジェクトの行動パターンであり、その主な利点は次の通りです。

  1. その内部表現を公開せず、コンテンツオブジェクトの重合にアクセスします。
  2. 集約クラスを簡素化し、完全なトラバーサルイテレータのタスク、引き渡しました。
  3. これは、新しいトラバーサルをサポートするためのイテレータサブクラスをカスタマイズしても、重合を横断するさまざまな方法をサポートしています。
  4. 元のコードを変更せずに、高分子イテレータクラスと簡単に新しいクラスを追加します。
  5. グッドカプセル化は、異なるポリマー構造をトラバースする統一されたインタフェースを提供します。


その主な欠点は、次のとおりある程度システムの複雑さを増加させるクラスの数が増加します。

アーキテクチャと実装モデル

反復モードはそう内部透明外部コードデータ集合にアクセスすることを、集合オブジェクトの内部構造の場合には、その目的を達成するためにイテレータクラスに抽象化重合挙動のうちオブジェクトは、露出していない横断することによって単離されます。今、私たちは基本的な構造と実装を分析する必要があります。

1.構造モデル

イテレータパターンは、主に次の役割が含まれています。

  1. 抽象重合(凝集体)の役割:ストレージの定義、追加、削除、およびインタフェースがイテレータオブジェクトをオブジェクト集約作ります。
  2. 特定重合(ConcreteAggregate)役割:それはイテレータ特定の例を返し、抽象クラス重合を実施します。
  3. 抽象反復子(イテレータ)の役割:定義アクセスインターフェイス要素と、一般に、第1のhasNext()、()、next()メソッドなどを含む、重合を横切ります。
  4. 詳細なイテレータ(Concretelterator)役割:抽象イテレータインタフェースの実装は、定義された、集合オブジェクトの完全なトラバーサル、トラバースの現在の位置を記録します。


図1に示す構造。
 

                                  図イテレータの構造のモード
 

実現の2モード

次のようにイテレータパターンコードは次のとおりです。

package iterator;
import java.util.*;
public class IteratorPattern
{
    public static void main(String[] args)
    {
        Aggregate ag=new ConcreteAggregate(); 
        ag.add("中山大学"); 
        ag.add("华南理工"); 
        ag.add("韶关学院");
        System.out.print("聚合的内容有:");
        Iterator it=ag.getIterator(); 
        while(it.hasNext())
        { 
            Object ob=it.next(); 
            System.out.print(ob.toString()+"\t"); 
        }
        Object ob=it.first();
        System.out.println("\nFirst:"+ob.toString());
    }
}
//抽象聚合
interface Aggregate
{ 
    public void add(Object obj); 
    public void remove(Object obj); 
    public Iterator getIterator(); 
}
//具体聚合
class ConcreteAggregate implements Aggregate
{ 
    private List<Object> list=new ArrayList<Object>(); 
    public void add(Object obj)
    { 
        list.add(obj); 
    }
    public void remove(Object obj)
    { 
        list.remove(obj); 
    }
    public Iterator getIterator()
    { 
        return(new ConcreteIterator(list)); 
    }     
}
//抽象迭代器
interface Iterator
{
    Object first();
    Object next();
    boolean hasNext();
}
//具体迭代器
class ConcreteIterator implements Iterator
{ 
    private List<Object> list=null; 
    private int index=-1; 
    public ConcreteIterator(List<Object> list)
    { 
        this.list=list; 
    } 
    public boolean hasNext()
    { 
        if(index<list.size()-1)
        { 
            return true;
        }
        else
        {
            return false;
        }
    }
    public Object first()
    {
        index=0;
        Object obj=list.get(index);;
        return obj;
    }
    public Object next()
    { 
        Object obj=null; 
        if(this.hasNext())
        { 
            obj=list.get(++index); 
        } 
        return obj; 
    }   
}

次のようにプログラムの結果は以下のとおりです。 

聚合的内容有:中山大学    华南理工    韶关学院   
First:中山大学

応用例のモード

イテレータパターンはブラウザ婺源風光明媚な観光マッププログラム[実施例1]に書き込まれます。

分析:婺源多くのモニュメントは、より適切な「イテレータパターン」のデザインとプログラムのビュースポットの写真とプロフィールを、設計します。

まず、各画像の名前と簡単な紹介を保持するために婺源名所(WyViewSpot)クラスを設計し、次にセットの観光名所(ViewSpotSet)抽象クラスの集合体であるインターフェース、追加および削除婺源アトラクションの方法を提供し、アクセス反復子を設計方法。

その後、観光スポットに関するすべての情報を保存し、親クラスの抽象メソッドを実装するためのArrayListのコンクリート骨材クラスで、婺源の対象セット(WyViewSpotSet)クラスを定義します。あって、婺源風景抽象イテレータ(ViewSpotltemtor)インタフェースを再定義ビュー方式スポット情報。

データ(ViewSpotSetが)によって、婺源の設定アトラクション、および実装ActionListenerインタフェースを初期化し、クライアントプログラム設計されたウィンドウプロシージャ、;抽象親クラスを実装婺源風景特定のイテレータ(WyViewSpotlterator)クラスの最後に、定義ビュー情報婺源名所(WyViewSpot)のに婺源の観光スポットイテレータ(ViewSpotlterator)。図2は、構成図です。
 

                            構造図婺源風光明媚な観光マップ閲覧プログラム


コードは以下の通りであります:

package iterator;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class PictureIterator{
    public static void main(String[] args)
    {
        new PictureFrame();
    }
}
//相框类
class PictureFrame extends JFrame implements ActionListener
{
    private static final long serialVersionUID=1L;
    ViewSpotSet ag; //婺源景点集接口
    ViewSpotIterator it; //婺源景点迭代器接口
    WyViewSpot ob;    //婺源景点类
    PictureFrame()
    {
        super("中国最美乡村“婺源”的部分风景图");
        this.setResizable(false);
        ag=new WyViewSpotSet(); 
        ag.add(new WyViewSpot("江湾","江湾景区是婺源的一个国家5A级旅游景区,景区内有萧江宗祠、永思街、滕家老屋、婺源人家、乡贤园、百工坊等一大批古建筑,精美绝伦,做工精细。")); 
        ag.add(new WyViewSpot("李坑","李坑村是一个以李姓聚居为主的古村落,是国家4A级旅游景区,其建筑风格独特,是著名的徽派建筑,给人一种安静、祥和的感觉。")); 
        ag.add(new WyViewSpot("思溪延村","思溪延村位于婺源县思口镇境内,始建于南宋庆元五年(1199年),当时建村者俞氏以(鱼)思清溪水而名。"));
        ag.add(new WyViewSpot("晓起村","晓起有“中国茶文化第一村”与“国家级生态示范村”之美誉,村屋多为清代建筑,风格各具特色,村中小巷均铺青石,曲曲折折,回环如棋局。")); 
        ag.add(new WyViewSpot("菊径村","菊径村形状为山环水绕型,小河成大半圆型,绕村庄将近一周,四周为高山环绕,符合中国的八卦“后山前水”设计,当地人称“脸盆村”。")); 
        ag.add(new WyViewSpot("篁岭","篁岭是著名的“晒秋”文化起源地,也是一座距今近六百历史的徽州古村;篁岭属典型山居村落,民居围绕水口呈扇形梯状错落排布。"));
        ag.add(new WyViewSpot("彩虹桥","彩虹桥是婺源颇有特色的带顶的桥——廊桥,其不仅造型优美,而且它可在雨天里供行人歇脚,其名取自唐诗“两水夹明镜,双桥落彩虹”。")); 
        ag.add(new WyViewSpot("卧龙谷","卧龙谷是国家4A级旅游区,这里飞泉瀑流泄银吐玉、彩池幽潭碧绿清新、山峰岩石挺拔奇巧,活脱脱一幅天然泼墨山水画。"));
        it = ag.getIterator(); //获取婺源景点迭代器 
        ob = it.first(); 
        this.showPicture(ob.getName(),ob.getIntroduce());
    }
    //显示图片
    void showPicture(String Name,String Introduce)
    {       
        Container cp=this.getContentPane();       
        JPanel picturePanel=new JPanel();
        JPanel controlPanel=new JPanel();       
        String FileName="src/iterator/Picture/"+Name+".jpg";
        JLabel lb=new JLabel(Name,new ImageIcon(FileName),JLabel.CENTER);   
        JTextArea ta=new JTextArea(Introduce);       
        lb.setHorizontalTextPosition(JLabel.CENTER);
        lb.setVerticalTextPosition(JLabel.TOP);
        lb.setFont(new Font("宋体",Font.BOLD,20));
        ta.setLineWrap(true);       
        ta.setEditable(false);
        //ta.setBackground(Color.orange);
        picturePanel.setLayout(new BorderLayout(5,5));
        picturePanel.add("Center",lb);       
        picturePanel.add("South",ta);       
        JButton first, last, next, previous;
        first=new JButton("第一张");
        next=new JButton("下一张");
        previous=new JButton("上一张");
        last=new JButton("最末张");
        first.addActionListener(this);
        next.addActionListener(this);
        previous.addActionListener(this);
        last.addActionListener(this);        
        controlPanel.add(first);
        controlPanel.add(next);
        controlPanel.add(previous);
        controlPanel.add(last);       
        cp.add("Center",picturePanel);
        cp.add("South",controlPanel);
        this.setSize(630, 550);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    @Override
    public void actionPerformed(ActionEvent arg0)
    {
        String command=arg0.getActionCommand();
        if(command.equals("第一张"))
        {
            ob=it.first(); 
            this.showPicture(ob.getName(),ob.getIntroduce());
        }
        else if(command.equals("下一张"))
        {
            ob=it.next(); 
            this.showPicture(ob.getName(),ob.getIntroduce());
        }
        else if(command.equals("上一张"))
        {
            ob=it.previous(); 
            this.showPicture(ob.getName(),ob.getIntroduce());
        }
        else if(command.equals("最末张"))
        {
            ob=it.last(); 
            this.showPicture(ob.getName(),ob.getIntroduce());
        }
    }
}
//婺源景点类
class WyViewSpot
{
    private String Name;
    private String Introduce;
    WyViewSpot(String Name,String Introduce)
    {
        this.Name=Name;
        this.Introduce=Introduce;
    }
    public String getName()
    {
        return Name;
    }
    public String getIntroduce()
    {
        return Introduce;
    }
}
//抽象聚合:婺源景点集接口
interface ViewSpotSet
{ 
    void add(WyViewSpot obj); 
    void remove(WyViewSpot obj); 
    ViewSpotIterator getIterator(); 
}
//具体聚合:婺源景点集
class WyViewSpotSet implements ViewSpotSet
{ 
    private ArrayList<WyViewSpot> list=new ArrayList<WyViewSpot>(); 
    public void add(WyViewSpot obj)
    { 
        list.add(obj); 
    }
    public void remove(WyViewSpot obj)
    { 
        list.remove(obj); 
    }
    public ViewSpotIterator getIterator()
    { 
        return(new WyViewSpotIterator(list)); 
    }     
}
//抽象迭代器:婺源景点迭代器接口
interface ViewSpotIterator
{
    boolean hasNext();
    WyViewSpot first();
    WyViewSpot next();
    WyViewSpot previous();
    WyViewSpot last(); 
}
//具体迭代器:婺源景点迭代器
class WyViewSpotIterator implements ViewSpotIterator
{ 
    private ArrayList<WyViewSpot> list=null; 
    private int index=-1;
    WyViewSpot obj=null;
    public WyViewSpotIterator(ArrayList<WyViewSpot> list)
    {
        this.list=list; 
    } 
    public boolean hasNext()
    { 
        if(index<list.size()-1)
        { 
            return true;
        }
        else
        {
            return false;
        }
    }
    public WyViewSpot first()
    {
        index=0;
        obj=list.get(index);
        return obj;
    }
    public WyViewSpot next()
    {         
        if(this.hasNext())
        { 
            obj=list.get(++index);
        } 
        return obj; 
    }
    public WyViewSpot previous()
    { 
        if(index>0)
        { 
            obj=list.get(--index); 
        } 
        return obj; 
    }
    public WyViewSpot last()
    {
        index=list.size()-1;
        obj=list.get(index);
        return obj;
    }
}

図3に示すプログラムの結果。
 

                       風光明媚な観光マップ閲覧プログラム婺源業績

シーンモードの応用

フロント反復モードの構造及び特性は、以下では、通常の状況を次の反復モードで使用されるアプリケーションシナリオを記述しています。

  1. 集合オブジェクトを横断する様々な方法を提供することが望まれる場合。
  2. 異なるポリマー構造を横断するときに統一されたインタフェースを提供することが望まれている場合。
  3. その内部表現の詳細を露出することなく、コンテンツオブジェクトの重合にアクセスするとき。


重合とイテレータの非常に接近しているので、重合を達成するため、ほとんどの言語のクラスは十分にあった既存の重合イテレータクラスの多数の場合には、以下の言語を使用して、イテレータクラスを提供します。

拡張モード

反復モードはしばしば関連付けられている組み合わせパターン容器部材アクセスモードの組み合わせ組み合わせて使用する、イテレータしばしば容器アセンブリコンフィギュレーションモードクラスに隠さ。もちろん、構成もイテレータ外部容器部材、図4に示す構造をアクセスすることができます。
 

                 組み合わせの反復モードの構成図

 

公開された136元の記事 ウォンの賞賛6 ビュー1539

おすすめ

転載: blog.csdn.net/weixin_42073629/article/details/104437886