Iterator迭代器

迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 編程環境中很是經常使用的設計模式。這種模式用於順序訪問集合對象的元素,不須要知道集合對象的底層表示。

迭代器模式屬於行爲型模式。java

介紹

意圖:提供一種方法順序訪問一個聚合對象中各個元素, 而又無須暴露該對象的內部表示。

主要解決:不一樣的方式來遍歷整個整合對象。

什麼時候使用:遍歷一個聚合對象。

如何解決:把在元素之間遊走的責任交給迭代器,而不是聚合對象。

關鍵代碼:定義接口:hasNext, next。

應用實例:JAVA 中的 iterator。

優勢: 一、它支持以不一樣的方式遍歷一個聚合對象。 二、迭代器簡化了聚合類。 三、在同一個聚合上能夠有多個遍歷。 四、在迭代器模式中,增長新的聚合類和迭代器類都很方便,無須修改原有代碼。

缺點:因爲迭代器模式將存儲數據和遍歷數據的職責分離,增長新的聚合類須要對應增長新的迭代器類,類的個數成對增長,這在必定程度上增長了系統的複雜性。

使用場景: 一、訪問一個聚合對象的內容而無須暴露它的內部表示。 二、須要爲聚合對象提供多種遍歷方式。 三、爲遍歷不一樣的聚合結構提供一個統一的接口。

注意事項:迭代器模式就是分離了集合對象的遍歷行爲,抽象出一個迭代器類來負責,這樣既能夠作到不暴露集合的內部結構,又可以讓外部代碼透明地訪問集合內部的數據。編程

 

實現

咱們將建立一個敘述導航方法的 Iterator 接口和一個返回迭代器的 Container 接口。實現了 Container 接口的實體類將負責實現 Iterator 接口。

IteratorPatternDemo,咱們的演示類使用實體類 NamesRepository 來打印 NamesRepository 中存儲爲集合的 Names。
設計模式

步驟 1ide


建立接口。

ui

Iterator.java

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

Container.java

public interface Container {
   public Iterator getIterator();
}


步驟 2

建立實現了 Container 接口的實體類。該類有實現了 Iterator 接口的內部類 NameIterator。

this

NameRepository.java

public class NameRepository implements Container {
   public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};

   @Override
   public Iterator getIterator() {
      return new NameIterator();
   }

   private class NameIterator implements Iterator {

      int index;

      @Override
      public boolean hasNext() {
         if(index < names.length){
            return true;
         }
         return false;
      }

      @Override
      public Object next() {
         if(this.hasNext()){
            return names[index++];
         }
         return null;
      }        
   }
}

 


步驟 3

使用 NameRepository 來獲取迭代器,並打印名字。

spa

IteratorPatternDemo.java

public class IteratorPatternDemo {
    
   public static void main(String[] args) {
      NameRepository namesRepository = new NameRepository();

      for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
         String name = (String)iter.next();
         System.out.println("Name : " + name);
      }     
   }
}

 


步驟 4

驗證輸出。

設計

Name : Robert
Name : John
Name : Julie
Name : Lora

 

 

Java8中Iterator接口的源碼:

3d

public interface Iterator<E>
{
    boolean hasNext();//判斷是否下一個
    E next();//獲取下一個
    default void remove() //刪除
    {
        throw new UnsupportedOperationException("remove");
    }
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

 

示例:

code

List list = new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
//方法一
for (Iterator iter = list.iterator(); iter.hasNext();)
 {
     String str = (String)iter.next();
    System.out.println(str);
}
//方法二
Iterator iter2 = list.iterator();
 while(iter2.hasNext())
 {
    String str = (String) iter2.next();
    System.out.println(str);
}
相關文章
相關標籤/搜索