設計模式之Iterator迭代器

Iterator模式是爲訪問容器提供一個統一的訪問方式,但是不暴露對象的內部細節。迭代器是爲容器設計的。

程序對對象的訪問必然也涉及到訪問的算法,不同的容器的訪問算法又是不一樣的。解決容器遍歷算法差異有兩種方案:第一,可以將遍歷方法塞到容器對象中去,容器承受了過多的功能,它不僅要負責自己“容器”內的元素維護(添加、刪除等等),而且還要提供遍歷自身的接口;第二,根本不提供容器遍歷算法,讓容器使用者自己去實現。該方法雖然是省事,卻又將容器的內部細節暴露無遺。 迭代器模式的出現,很好的解決了上面兩種情況的弊端,不但將遍歷容器的算法從不同集合容器類中抽象出來,同時又對外隱藏了容器的具體實現細節。

迭代器模式由以下角色組成:

1 迭代器(Iterator)角色:負責定義訪問和遍歷元素的接口。

2 具體迭代器角色(Concrete Iterator):實現迭代器接口,並記錄當前的訪問元素的位置。

3 容器角色(Contrainer):負責定義和創建迭代器接口。

Java集合框架中迭代設計模式的應用:

//迭代器 ,該接口提供了迭代遍歷的通用方法
public interface Iterator { 
      boolean hasNext(); 
      Object next(); 
      void remove(); 
} 
//容器迭代化接口,凡是實現此接口的集合容器距可以生成相應的迭代器 
public interface Iterable<T>{
      //產生迭代器,將容器對象轉換爲迭代器對象
      Iterator<T> interator();
}
//java集合框架的根接口,該接口繼承了容器迭代化接口,因此java中的集合都可以被迭代
public interface Collection<E> extends Iterable<E>


定義迭代器,以ArrayList爲自定義迭代容器的底層數據結構,實現自定義迭代器的代碼如下:

public class MyIterator implements Iterable { 
      //存放數據的集合
      private ArrayList list;
     //負責創建具體迭代器角色的工廠方法 
     public Iterator iterator() { 
          return new Itr(list); 
     } 
    //作爲內部類的具體迭代器角色 
    private class Itr implements Iterator { 
           ArrayList myList;
          int position = 0; 
           public Itr(ArrayList list) { 
                  this.myList = list; 
           } 
           public Object next() { 
                  Object obj = myList.get(position);
                  position++; 
                  return obj; 
          } 
          public boolean hasNext() { 
                 if (position >= myList.size()) { 
                       return false; 
                 } else { 
                     return true; 
                 } 
           }
        //不支持remove操作
        public void remove(){
              throw new UnsupportedOperationException( 
            "Alternating MyIterator does not support remove()"); 
}
 }
 } 

Iterator模式的優點:

1 功能分離,簡化容器接口。容器只是實現基本的功能,把迭代器的功能交給外部類來實現,符合類的設計原則。

2 隱藏容器的設計細節

3 爲容器提供統一的訪問接口

4 可以爲容器實現多個迭代器接口

JDK中設計模式的應用:

java.util.Iterator

java.util.Enumeration


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