1. 程式人生 > >23種設計模式(13):叠代器模式

23種設計模式(13):叠代器模式

關系 想象 遍歷集合 spa 意思 比較 使用 string 對象方法

定義:提供一種方法訪問一個容器對象中各個元素,而又不暴露該對象的內部細節。

類型:行為類模式。

類圖:

如果要問java中使用最多的一種模式,答案不是單例模式,也不是工廠模式,更不是策略模式,而是叠代器模式,先來看一段代碼吧:

```java view plaincopy

public static void print(Collection coll){

Iterator it = coll.iterator();  

while(it.hasNext()){  

    String str = (String)it.next();  

    System.out.println(str);  

}  

}


這個方法的作用是循環打印一個字符串集合,裏面就用到了叠代器模式,java語言已經完整地實現了叠代器模式,Iterator翻譯成漢語就是叠代器的意思。提到叠代器,首先它是與集合相關的,集合也叫聚集、容器等,我們可以將集合看成是一個可以包容對象的容器,例如List,Set,Map,甚至數組都可以叫做集合,而叠代器的作用就是把容器中的對象一個一個地遍歷出來。

叠代器模式的結構:

抽象容器:一般是一個接口,提供一個iterator()方法,例如java中的Collection接口,List接口,Set接口等。

具體容器:就是抽象容器的具體實現類,比如List接口的有序列表實現ArrayList,List接口的鏈表實現LinkList,Set接口的哈希列表的實現HashSet等。

抽象叠代器:定義遍歷元素所需要的方法,一般來說會有這麽三個方法:取得第一個元素的方法first(),取得下一個元素的方法next(),判斷是否遍歷結束的方法isDone()(或者叫hasNext()),移出當前對象的方法remove(),

叠代器實現:實現叠代器接口中定義的方法,完成集合的叠代。

代碼實現:

```java  

interface Iterator {  

    public Object next();  

    public boolean hasNext();  

}  

class ConcreteIterator implements Iterator{  

    private List list = new ArrayList();  

    private int cursor =0;  

    public ConcreteIterator(List list){  

        this.list = list;  

    }  

    public boolean hasNext() {  

        if(cursor==list.size()){  

            return false;  

        }  

        return true;  

    }  

    public Object next() {  

        Object obj = null;  

        if(this.hasNext()){  

            obj = this.list.get(cursor++);  

        }  

        return obj;  

    }  

}  

interface Aggregate {  

    public void add(Object obj);  

    public void remove(Object obj);  

    public Iterator iterator();  

}  

class ConcreteAggregate implements Aggregate {  

    private List list = new ArrayList();  

    public void add(Object obj) {  

        list.add(obj);  

    }  



    public Iterator iterator() {  

        return new ConcreteIterator(list);  

    }  



    public void remove(Object obj) {  

        list.remove(obj);  

    }  

}  

public class Client {  

    public static void main(String[] args){  

        Aggregate ag = new ConcreteAggregate();  

        ag.add(“小明”);  

        ag.add(“小紅”);  

        ag.add(“小剛”);  

        Iterator it = ag.iterator();  

        while(it.hasNext()){  

            String str = (String)it.next();  

            System.out.println(str);  

        }  

    }  

}

上面的代碼中,Aggregate是容器類接口,大家可以想象一下Collection,List,Set等,Aggregate就是他們的簡化版,容器類接口中主要有三個方法:添加對象方法add、刪除對象方法remove、取得叠代器方法iterator。Iterator是叠代器接口,主要有兩個方法:取得叠代對象方法next,判斷是否叠代完成方法hasNext,大家可以對比java.util.List和java.util.Iterator兩個接口自行思考。

叠代器模式的優點有:

簡化了遍歷方式,對於對象集合的遍歷,還是比較麻煩的,對於數組或者有序列表,我們尚可以通過遊標來取得,但用戶需要在對集合了解很清楚的前提下,自行遍歷對象,但是對於hash表來說,用戶遍歷起來就比較麻煩了。而引入了叠代器方法後,用戶用起來就簡單的多了。

可以提供多種遍歷方式,比如說對有序列表,我們可以根據需要提供正序遍歷,倒序遍歷兩種叠代器,用戶用起來只需要得到我們實現好的叠代器,就可以方便的對集合進行遍歷了。

封裝性良好,用戶只需要得到叠代器就可以遍歷,而對於遍歷算法則不用去關心。

叠代器模式的缺點:

對於比較簡單的遍歷(像數組或者有序列表),使用叠代器方式遍歷較為繁瑣,大家可能都有感覺,像ArrayList,我們寧可願意使用for循環和get方法來遍歷集合。

叠代器模式的適用場景:

叠代器模式是與集合共生共死的,一般來說,我們只要實現一個集合,就需要同時提供這個集合的叠代器,就像java中的Collection,List、Set、Map等,這些集合都有自己的叠代器。假如我們要實現一個這樣的新的容器,當然也需要引入叠代器模式,給我們的容器實現一個叠代器。

但是,由於容器與叠代器的關系太密切了,所以大多數語言在實現容器的時候都給提供了叠代器,並且這些語言提供的容器和叠代器在絕大多數情況下就可以滿足我們的需要,所以現在需要我們自己去實踐叠代器模式的場景還是比較少見的,我們只需要使用語言中已有的容器和叠代器就可以了。

23種設計模式(13):叠代器模式