迭代器模式

维基百科,自由的百科全书
跳转至: 导航搜索

物件導向程式設計裡,迭代器模式是一種設計模式,是一種最簡單也最常見的設計模式。它可以讓使用者透過特定的介面巡訪容器中的每一個元素而不用了解底層的實作。

此面,也可以實作特定目的版本的迭代器。

介面[编辑]

《設計模式》建議合理的介面該要有:

public interface Iterator
{
    public Object First();
    public Object Next();
    public boolean isDone();
    public Object CurrentItem();
}

示例[编辑]

Java[编辑]

interface Iterator{
    Object First();
    Object Next();
    boolean IsDone();
    Object CurrentItem();
}
 
abstract class Aggregate{
    abstract Iterator CreateIterator();
}
 
class ConcreteIterator implements Iterator{
    private List<Object> list = new ArrayList<Object>();
    private int curr=0;
    public ConcreteIterator(List<Object> list){
        this.list = list;
    }
 
    public Object First(){
        return list.get(0);
    }
 
    public Object Next(){
        Object ret = null;
        curr++;
        if(curr < list.size()){
            ret = list.get(curr);
        }
        return ret;
    }
 
    public boolean IsDone(){
        return curr>=list.size()?true:false;
    }
 
    public Object CurrentItem(){
        return list.get(curr);
    }
}
 
class ConcreteAggregate extends Aggregate{
    private List<Object> list = new ArrayList<Object>();
    public ConcreteAggregate(List<Object> list){
        this.list = list;
    }
    public Iterator CreateIterator(){
        return new ConcreteIterator(list);
    }
}
 
class client{
    public static void main(String[] args){
    List<Object> list = new ArrayList<Object>();
    list.add("miner");
    list.add("any");
    Aggregate agg = new ConcreteAggregate(list);
    Iterator iterator = agg.CreateIterator();
    iterator.First();
    while(!iterator.IsDone()){
        System.out.println(iterator.CurrentItem());
        iterator.Next();
        }
    }
}

C++[编辑]

Python[编辑]

在 Python 中,迭代器是遵循迭代協議的物件。使用者可以使用 iter() 以從任何序列得到迭代器(如 list, tuple, dictionary, set 等)。另一個方法則是建立一個另一種形式的迭代器 —— generator 。要取得下一個元素,則使用成員函式 next()(Python 2)或函數 next() function (Python 3) 。當沒有元素時,則引發 StopIteration 此例外。若要實作自己的迭代器,則只要實作 next()(Python 2)或 __next__()( Python 3)。

以下為兩個例子:

# 從序列得到
x = [42, "test", -12.34]
it = iter(x)
try:
  while True:
    x = next(it) # 在 Python 2 中,要改成 it.next()
    print x
except StopIteration:
  pass
 
# generator
def foo(n):
  for i in range(n):
    yield i
 
it = foo(5)
try:
  while True:
    x = next(it) # 在 Python 2 中,要改成 it.next()
    print x
except StopIteration:
  pass

問題[编辑]

  • 在巡訪過程中,容器可能會被外部改變。譬如新增或刪除一個元素。

另見[编辑]