【設計模式基礎】行為模式 - 7 - 迭代器(Iterator)

王曉斌發表於2014-02-18

1. 模式意圖

別名遊標(Cursor),提供一種方法順序訪問一個聚合物件中各個元素,而又不需要暴露該物件的內部物件。


這一模式的關鍵思想是將對列表/聚合的訪問和遍歷從聚合物件中分離出來並放入一個迭代器物件中。迭代器類定義一個訪問該聚合元素的介面。迭代器物件負責跟蹤當前的元素:即,它知道哪些元素已經遍歷過了。

將遍歷機制與聚合物件分離使我們可以定義不同的迭代器來實現不同的遍歷策略。


迭代器和聚合是耦合在一起的,而且客戶物件必須知道遍歷的聚合結構。最好能有一種辦法使得不需改變客戶程式碼即可改變該聚合類。可以通過將迭代器的概念推廣到多型迭代來達到這個目標。


建立迭代器,要讓聚合物件負責建立相應的迭代器。客戶請求呼叫該操作以獲得一個迭代器物件。


在同一個聚合上可以有多個遍歷,每個迭代器保持它自己的遍歷狀態。因此,可以同時進行多個遍歷。


2. 模式定義



迭代器(Iterator):                            迭代器定義訪問和遍歷元素的介面。

具體迭代器(ConcreteIterator):  具體迭代器實現迭代器介面;對該聚合遍歷時跟蹤當前位置。

聚合(Aggregate):                          聚合定義建立相應迭代器物件的介面。

具體聚合(ConcreteAggregate):具體聚合實現建立相應迭代器的介面。


3. 模式實現

3.1 Java實現迭代器模式

interface Iterator {  
    public Object next();  
    public boolean hasNext();  
}  
class ConcreteIterator implements Iterator{  
    private List list = new ArrayList();  
    private int cursor =0;  
    public ConcreteIterator(List list){  
        this.list = list;  
    }  
    public boolean hasNext() {  
        if(cursor==list.size()){  
            return false;  
        }  
        return true;  
    }  
    public Object next() {  
        Object obj = null;  
        if(this.hasNext()){  
            obj = this.list.get(cursor++);  
        }  
        return obj;  
    }  
}  
interface Aggregate {  
    public void add(Object obj);  
    public void remove(Object obj);  
    public Iterator iterator();  
}  
class ConcreteAggregate implements Aggregate {  
    private List list = new ArrayList();  
    public void add(Object obj) {  
        list.add(obj);  
    }  
  
    public Iterator iterator() {  
        return new ConcreteIterator(list);  
    }  
  
    public void remove(Object obj) {  
        list.remove(obj);  
    }  
}  
public class Client {  
    public static void main(String[] args){  
        Aggregate ag = new ConcreteAggregate();  
        ag.add("1");  
        ag.add("2");  
        ag.add("3");  
        Iterator it = ag.iterator();  
        while(it.hasNext()){  
            String str = (String)it.next();  
            System.out.println(str);  
        }  
    }  
}  


4. 模式應用





相關文章