Iterator 迭代器模式 MD

迭代器模式

簡介

Iterator模式是行爲模式之一,它把對容器中包含的內部對象的訪問【委讓】給外部類,使用Iterator按順序進行遍歷訪問。設計模式

在程序設計中,常常有這種狀況:須要從大量的數據集合中一個個地取出數據加以處理。Iterator模式就是爲了有效地處理按順序進行遍歷訪問的一種設計模式,簡單地說,Iterator模式提供一種有效的方法,能夠屏蔽彙集對象集合的容器類的實現細節,而能對容器內包含的對象元素按順序進行有效的遍歷訪問。ide

Iterator模式的應用場景能夠概括爲知足如下幾個條件:this

  • 訪問容器中包含的內部對象
  • 按順序訪問


下面是一種比較經典的Iterator模式實現方案,該實現方案基於接口設計原則,設計瞭如下幾個接口或類:spa

  • 迭代器接口Iterator:該接口必須定義實現迭代功能的最小定義方法集,好比提供hasNext()和next()方法。
  • 迭代器實現類:迭代器接口Iterator的實現類。能夠根據具體狀況加以實現。
  • 容器接口:定義基本功能以及提供相似Iterator iterator()的方法。
  • 容器實現類:容器接口的實現類。

優勢設計

  • 實現功能分離,簡化容器接口。讓容器只實現自己的基本功能,把迭代功能委讓給外部類實現,符合類的設計原則。
  • 爲容器或其子容器提供了一個統一接口,一方面方便調用;另外一方面使得調用者沒必要關注迭代器的實現細節。

案例

定義一個自定義的集合的功能code

 1 public interface MyList {
 2    MyIterator iterator();//自定義迭代器
 3    Object get(int index);
 4    int getSize();
 5    void add(Object obj);
 6 }
 7 public class MyListImpl implements MyList {
 8    private Object[] list;
 9    private int index;
10    private int size;
11    public MyListImpl() {
12        index = 0;
13        size = 0;
14        list = new Object[100];
15   }
16    @Override
17    public MyIterator iterator() {
18        return new MyIteratorImpl(this); //將自身的引用傳給了迭代器
19   }
20    @Override
21    public Object get(int index) {
22        if (index > size - 1) throw new RuntimeException("超出邊界了");
23        return list[index];
24   }
25    @Override
26    public int getSize() {
27        return this.size;
28   }
29    @Override
30    public void add(Object obj) {
31        list[index++] = obj;
32        size++;
33   }
34 }

 

迭代器。定義訪問和遍歷元素的接口對象

public interface MyIterator {
   Object next();
   boolean hasNext();
}
public class MyIteratorImpl implements MyIterator {
   private MyList list;//自定義集合
   private int index;
   public MyIteratorImpl(MyList list) {
       index = 0;
       this.list = list;
  }
   @Override
   public Object next() {
       Object obj = list.get(index);
       index++;
       return obj;
  }
   @Override
   public boolean hasNext() {
       return index < list.getSize();
  }
}

 

適用性blog

訪問一個聚合對象的內容而無需暴露它的內部表示
支持對聚合對象的多種遍歷
爲遍歷不一樣的聚合結構提供一個統一的接口(即支持多態迭代)接口

public class Test {
   public static void main(String[] args) {
       MyList list = new MyListImpl();
       list.add("a");
       list.add("b");
       list.add("c");
​
       //第一種迭代方式
       for (int i = 0; i < list.getSize(); i++) {
           System.out.println(list.get(i));
      }
​
       //第二種迭代方式
       MyIterator it = list.iterator();
       while (it.hasNext()) {
           System.out.println(it.next());
      }
  }
}

 

2016-04-21get

相關文章
相關標籤/搜索