【Java設計模式】:行爲型模式—迭代器模式

1. 迭代器模式定義

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

迭代器模式不復雜,也比較常見,我們平時用的Java集合類對象其實內部已經實現了迭代器模式,比如ArrayList。

2. 迭代器模式的角色構成

(1)迭代器角色(Iterator):定義遍歷元素所需要的方法,一般來說會有這麼三個方法:取得下一個元素的方法next(),判斷是否遍歷結束的方法hasNext()),移出當前對象的方法remove(),

(2)具體迭代器角色(Concrete Iterator):實現迭代器接口中定義的方法,完成集合的迭代。

(3)容器角色(Aggregate): 一般是一個接口,提供一個iterator()方法,例如java中的Collection接口,List接口,Set接口等

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

3. 迭代器模式應用的場景及意義

應用場景

  1. 訪問一個聚合對象的內容而無需暴露它的內部表示

  2. 支持對聚合對象的多種遍歷

  3. 爲遍歷不同的聚合結構提供一個統一的接口

迭代器模式四個角色之間的關係可以用類圖表示
在這裏插入圖片描述

具體代碼實現

定義迭代器角色(Iterator):

 public interface Iterator {
 
     public boolean hasNext();
    public Object next();
 }

定義具體迭代器角色(Concrete Iterator):

package patten.design;

import patten.design.List;;

public class ConcreteIterator implements Iterator {
    private List list = null;
    private int index;

    public ConcreteIterator(List list) {
        super();
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        if (index >= list.getSize()) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public Object next() {
        Object object = list.get(index);
        index++;
        return object;
    }

}

定義容器角色(Aggregate):

package patten.design;

//定義集合可以進行的操作
public interface List {

    public void add(Object obj);  
    public Object get(int index);
    public Iterator iterator();  
    public int getSize();
}

定義具體容器角色(ConcreteAggregate):

package patten.design;

public class ConcreteAggregate implements List{

    private Object[] list;
    private int size=0;
    private int index=0;
    public ConcreteAggregate(){
        index=0;
        size=0;
        list=new Object[100];
    }
    @Override
    public void add(Object obj) {
        list[index++]=obj;
        size++;
    }

    @Override
    public Iterator iterator() {
        
        return new ConcreteIterator(this);
    }
    @Override
    public Object get(int index) {
        
        return list[index];
    }
    @Override
    public int getSize() {
        
        return size;
    }

}

代碼測試:

package patten.design;

public class IteratorTest {

    /**
     * @param args
     */
    public static void main(String[] args) {

        List list=new ConcreteAggregate();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        Iterator it=list.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }

}

4. 迭代器模式的優缺點

迭代器模式的優點有:

  • 簡化了遍歷方式,對於對象集合的遍歷,還是比較麻煩的,對於數組或者有序列表,我們尚可以通過遊標來取得,但用戶需要在對集合瞭解很清楚的前提下,自行遍歷對象,但是對於hash表來說,用戶遍歷起來就比較麻煩了。而引入了迭代器方法後,用戶用起來就簡單的多了。
  • 可以提供多種遍歷方式,比如說對有序列表,我們可以根據需要提供正序遍歷,倒序遍歷兩種迭代器,用戶用起來只需要得到我們實現好的迭代器,就可以方便的對集合進行遍歷了。
  • 封裝性良好,用戶只需要得到迭代器就可以遍歷,而對於遍歷算法則不用去關心。

迭代器模式的缺點:

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

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

參考原文:https://www.cnblogs.com/ysw-go/p/5384516.html

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