1. 程式人生 > >設計模式學習筆記(十三)—Iterator迭代器模式

設計模式學習筆記(十三)—Iterator迭代器模式

轉貼自 http://www.blogjava.net/flustar/archive/2007/12/04/iterator.html

Iterator模式定義:
提供一個方法順序訪問一個聚合物件的各個元素,而又不暴露該物件的內部表示。
這個模式在java的類庫中已經實現了,在java中所有的集合類都實現了Conllection介面,而Conllection介面又繼承了 Iterable介面,該介面有一個iterator方法,也就是所以的集合類都可以通過這個iterator方法來轉換成Iterator類,用 Iterator物件中的hasnext方法來判斷是否還有下個元素,next方法來順序獲取集合類中的物件。今天面試考到設計模式,我愣是沒答上來,我 暈死,自己這幾天剛學的東西,自己也都理解,可一到考試的時候不是忘了就是回答的不準確,自己也不清楚到底是為什麼,哎,傷心。。。。。。,下面是 Iterator模式的結構圖:


 在這個結構圖中的Aggregate抽象類也可以定義成介面。下面給出一個例子來說明Iterator模式的使用。
import java.util.ArrayList;

interface Iterator<E>{
 public void first();
 public void next();
 public E currentItem();
 public boolean isDone();
}
class ConcreteIterator<E> implements Iterator<E>{

 private ConcreteAggregate<E> agg;
 private int index=0;
 private int size=0;

    public ConcreteIterator( ConcreteAggregate<E> aggregate) {
  this.agg=aggregate;
  this.index=0;
  this.size=aggregate.size();
 }

 public E currentItem() {
  return agg.getElement(index);
 }

 public void first() {
  index=0;
 }

 public boolean isDone() {
  if(index>=size){
   return true;
  }
  return false;
 }

 public void next() {
  if(index<size){
   index++; 
     }
 
    }
}
abstract class Aggregate<E>{
 
 protected abstract Iterator createIterator();
}
class ConcreteAggregate<E> extends Aggregate<E>{
 private ArrayList<E> arrayList=new ArrayList<E>();
 public Iterator createIterator() {
  
  return new ConcreteIterator<E>(this);
 }
 public void add(E o){
  arrayList.add(o);
 }
 public E getElement(int index) {

       if (index<arrayList.size()) {

         return arrayList.get(index);

       } else {

         return null;

       }

    }

    public int size(){

       return arrayList.size();

    }


}

public class Client {

 public static void main(String[] args) {
  ConcreteAggregate<String> aggregate=new ConcreteAggregate<String>();
  aggregate.add("A");
  aggregate.add("B");
  aggregate.add("C");
  aggregate.add("D");
  aggregate.add("E");
  Iterator iterator=aggregate.createIterator();
  for(iterator.first();!iterator.isDone();iterator.next()){
   System.out.println(iterator.currentItem());
  }
  
 }
}
輸出結果:
A
B
C
D
E
在這個例子中,我們按照Iterator模式的結構圖來建立的例子,我們建立的集合ConcreteAggregate可以存放任何型別的資料,然後使用 createIterator方法轉換成Iterator物件,使用Iterator物件來按順序顯示集合中的內容。這個模式在Java的jdk中是這樣 實現的,所以的集合類都實現了Iterable介面,這個介面中有一個iterator方法可以把集合類的物件轉換成Iterator類的物件。明白這個 原理可以更好的理解Java中的集合類和迭代器,根據這個可以建立功能更加強大的集合類。
小結:Iterator模式主要用在當一個集合類中的元素經常變動時,而不需要改變客戶端的程式碼。