イテレータパターン-Iteratorパターン

ディレクトリ

モデルの定義と特性

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

応用例のモード

シーンモードの応用

拡張モード


現実の生活だけでなく、プログラミングでは、多くの場合、重合の様々な要素でターゲットにアクセスしたい、通常の練習は、リンクリストトラバーサルを作成すると、同じクラスに配置されているが、交換したい場合は、このアプローチは、拡張子に助長されていませんトラバーサル方法はとは逆である、ソースコードを変更する必要があり、「オン - オフ原則。」

ソフトウェア開発では、我々は多くの場合、データ集約のシリーズを格納するオブジェクトを使用する必要があります。集合オブジェクトは2つの機能がありますデータを格納するための1つを、第二のデータを介してです。ビュー依存性から、前者は基本デューティ集合体オブジェクトであるだけ変更することができ、後者は分離可能です。したがって、データスルー動作は、集約オブジェクトの設計を簡単にする集約オブジェクト、重合イテレータによってオブジェクト内のデータを提供する行為を横断するオブジェクトに「反復」と呼ばれるパッケージから分離することができます、「単一責任の原則」の要件に沿って、より多くの。

集合オブジェクトとそのトラバーサル挙動を分離重合イテレータクラスのクライアント・ベースのアクセスの間に介在されている「反復モード」、顧客は、その内部の詳細を隠し、および「単一原理機能」および「オン-オフを満たしますなどの原則」  Jコレクション、リスト、セット、マップにあるAVAので、イテレータが含まれています。

モデルの定義と特性

オブジェクトの内部表現を露出させることなく、シーケンシャルアクセスデータオブジェクト重合のシリーズを提供することを目的と、重合:イテレータは、(イテレータ)モード定義されます。反復子は、オブジェクトの行動パターンで以下のように、その主な利点です。

  1. (これは、同じオブジェクトがポリマートラバーサルの様々な定義することができ、集約オブジェクトを通過するさまざまな方法をサポートしています。ただ、トラバーサルアルゴリズムを変更するには、元のイテレータイテレータモードを置き換えるために異なる反復子を使用して、我々はまた、ナビゲートするための新しい方法をサポートするために、独自のイテレータのサブクラスを定義することができます。
  2.  イテレータクラスは、重合を簡素化します。イテレータの導入以来、元のデータオブジェクト内の重合は、重合クラスの設計を簡素化することができ、独自のトラバーサル方法を、提供する必要はありません。
  3. 反復モードでは、抽象化レイヤの導入以来、及び「開閉原則」の要件を満たすために、既存のコードを変更することなく、簡単重合イテレータクラスの新しいクラスを追加します。


主な欠点は以下のとおりです。

(1)新しいクラスを追加データを介して業務反復モードと格納データの分離は、ある程度、システムの複雑さを増加させる新しい重合イテレータクラスの対応する増加、ペア増加のクラスの数を、必要とするので、 。

(2)大規模な設計抽象イテレータの難しさを、十分に考慮にシステムの将来の拡張を取る必要があり、そのような逆方向移動を実装する必要が、唯一の反復子などそのサブクラスを介して達成することができる場合は、内蔵JDK反復子イテレータトラバーサルリバースは、達成することができないように反復子の反復子は、集約オブジェクト型セットの操作中に使用することはできません。カスタムイテレータは、抽象イテレータを総合的に勘案を作成するとき、それは簡単なことではありません。

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

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

1.構造モデル

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

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


図1に示す構造。
 

図イテレータの構造のモード
図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:中山大学

応用例のモード

イテレータパターンと婺源の観光プログラムの風光明媚な地図を見る書きます。

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

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

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

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

構造図婺源風光明媚な観光マップ閲覧プログラム
図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に示す構造をアクセスすることができます。
 

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

おすすめ

転載: blog.csdn.net/yucaixiang/article/details/95040566