Java設計模式:叠代器模式

作者:網絡 | 發布時間:2020年10月30日 | 閱讀:765

定義:提供一(yī)種方法訪問一(yī)個容器對象中(zhōng)各個元素,而又(yòu)不暴露該對象的内部細節。

類型:行爲類模式

類圖:

iterator-pattern

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

    public static void print(Collection coll){
        Iterator it = coll.iterator();
        while(it.hasNext()){
            String str = (String)it.next();
            System.out.println(str);
        }
    }

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

叠代器模式的結構

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

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

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

  • 叠代器實現:實現叠代器接口中(zhōng)定義的方法,完成集合的叠代。

代碼實現

    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("小(xiǎo)明");
            ag.add("小(xiǎo)紅");
            ag.add("小(xiǎo)剛");
            Iterator it = ag.iterator();
            while(it.hasNext()){
                String str = (String)it.next();
                System.out.println(str);
            }
        }
    }

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


叠代器模式的優缺點

叠代器模式的優點有:

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

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

  • 封裝性良好,用戶隻需要得到叠代器就可以遍曆,而對于遍曆算法則不用去(qù)關心。

叠代器模式的缺點:

  • 對于比較簡單的遍曆(像數組或者有序列表),使用叠代器方式遍曆較爲繁瑣,大(dà)家可能都有感覺,像ArrayList,我(wǒ)們甯可願意使用for循環和get方法來遍曆集合。

叠代器模式的适用場景

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

但是,由于容器與叠代器的關系太密切了,所以大(dà)多數語言在實現容器的時候都給提供了叠代器,并且這些語言提供的容器和叠代器在絕大(dà)多數情況下(xià)就可以滿足我(wǒ)們的需要,所以現在需要我(wǒ)們自己去(qù)實踐叠代器模式的場景還是比較少見的,我(wǒ)們隻需要使用語言中(zhōng)已有的容器和叠代器就可以了。

相關内容