設計思想學習—迭代器模式

迭代器模式

學到現在漸漸的感覺抓到一點點感覺,那就是學習模式的時候先看定義然後,嘗試理解它,理解目的不管百度還是查資料也好,這樣不管模式有多複雜,但是目的不會變,理解他的思想後就簡單很多。

迭代器模式(Iterator ):提供一種方法順序訪問聚合對象中的每個元素,而不是暴露其內部表示。

迭代器模式的定義並不難理解就是就是遍歷聚合對象中的每個元素,只不過有前提就是了。

class HarryPotterCD{
    private List list;
    public HarryPotterCD(){
        list=new ArrayList();
        list.add("哈利·波特與火焰杯");
        list.add("哈利·波特與鳳凰社");
        list.add("哈利·波特與混血王子");
        list.add("哈利·波特與死亡聖器");
    }
}
class HarryPotterBook{
    private String[] str;
    public HarryPotterBook(){
        str=new String[7];
        str[0]="哈利·波特與魔法石";
        str[1]="哈利·波特與密室";
        str[2]="哈利·波特與阿茲卡班囚徒";
    }
}

上面有一整套哈利波特,但是有三本是書有四季的的電影,要求一起遍歷他們。

首先抽象,然後需要一個迭代器

abstract class HarryPotter{
    public abstract Iterator createIterator();
}
interface Iterator{
     boolean hasNext();
     Object next();
     void printAll();
}

然後需要各自的迭代器去遍歷他們

class CDIterator implements Iterator{
    private List list;
    private int index=0;
    public CDIterator(List list){
        this.list=list;
    }
    @Override
    public boolean hasNext() {
        if(index<=list.size()-1){
            return true;
        }
        return false;
    }
    @Override
    public Object next() {
        Object ob=list.get(index);
        index++;
        return ob;
    }
    @Override
    public void printAll(){
        while(hasNext()){
            System.out.println(next().toString());
        }
    }
}
class BookIterator implements Iterator{
    private String[] hp;
    private int index=0;
    public BookIterator(String[] hp){
        this.hp=hp;
    }
    @Override
    public boolean hasNext() {
        if(index<= hp.length-1){
            return true;
        }
        return false;
    }
    @Override
    public Object next() {
        Object ob=hp[index];
        index++;
        return ob;
    }   
    @Override
    public void printAll(){
        while(hasNext()){
            System.out.println(next().toString());
        }
    }
}

最後看看測試輸出

public class Client {
    public static void main(String[] args){
        HarryPotter book=new HarryPotterBook();
        HarryPotter CD=new HarryPotterCD();
        Iterator it=book.createIterator();
        it.printAll();
        it=CD.createIterator();
        it.printAll();      
    }
}

輸出的是:
哈利·波特與魔法石
哈利·波特與密室
哈利·波特與阿茲卡班囚徒
哈利·波特與火焰杯
哈利·波特與鳳凰社
哈利·波特與混血王子
哈利·波特與死亡聖器

我還特地跑過去看了下java.util裏面的Iterator、ListIterator、ArrayList的源碼其實思想是一樣的,只不過官方把具體的迭代器寫成內部類放在ArrayList裏面

迭代器的組成:

  • 抽象迭代器(Iterator):所有迭代器都需要實現的接口,提供了遊走聚合對象元素之間的方法。

  • 具體迭代器(ConcreteIterator):利用這個具體的迭代器能夠對具體的聚合對象進行遍歷。每一個聚合對象都應該對應一個具體的迭代器。

  • 抽象聚合類(Aggregate):聚合定義創建相應迭代器對象的接口

  • 具體聚合類 (ConcreteAggregate):實現creatorIterator()方法,返回該聚合對象的迭代器。

UML

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章