热门问题
时间线
聊天
视角

迭代器模式

来自维基百科,自由的百科全书

迭代器模式
Remove ads

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

Thumb
迭代器模式

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

結構

Thumb
迭代器模式的樣例UML類圖和序列圖[1]

在上面的UML類圖中,Client類提及Aggregate接口,用它來創建一個Iterator對象(createIterator()),接着提及Iterator接口用來遊歷一個Aggregate對象(next()和hasNext())。Iterator1類通過訪問Aggregate1類實現這個Iterator接口。

UML序列圖展示運行時交互:Client對象調用createIterator()於一個Aggregate1對象之上,它創將一個Iterator1對象並將它返回給ClientClient接着使用Iterator1來遊歷Aggregate1對象的元素。

示例

Java

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();
        }
    }
}

Python

Python中,迭代器是遵循迭代器協議的物件。通過使用函數iter(),可以從任何容器對象(如列表、元組、字典和集合等)得到迭代器。另一個方式是建立生成器,它可以看作是另一種形式的迭代器。要取得下一個元素,則使用函數next()。當沒有下一個元素時,則引發StopIteration例外。用戶定義的類若要實作自己的迭代器,則需要實作__iter__()__next__()。以下為兩個例子:

# 從序列得到
x = [42, "test", -12.34]
it = iter(x)
try:
    while True:
        x = next(it)
        print(x)
except StopIteration:
    pass

# 生成器
def foo(n):
    for i in range(n):
        yield i

it = foo(5)
try:
    while True:
        x = next(it)
        print(x)
except StopIteration:
    pass
Remove ads

.NET語言

For Each…Next(Visual Basic)或者foreach(C#)循環語句,將調用迭代器遍歷一個序列,每次獲取一個返回值。

迭代器可以作為一個方法或屬性的get訪問器,其中的Yield (Visual Basic)或yield return (C#)語句返回迭代器的返回值,並記住當前執行的位置。下次再調用迭代器,從該執行位置恢復執行,直至迭代器代碼執行完或者遇到Exit Function或Return語句(Visual Basic)或yield break語句(C#) 。編譯器把迭代器作為一個狀態機的類。

Sub Main()
    Dim days As New DaysOfTheWeek()
    For Each day As String In days
        Console.Write(day & " ")
    Next 
    ' Output: Sun Mon Tue Wed Thu Fri Sat
    Console.ReadKey()
End Sub 

Private Class DaysOfTheWeek
    Implements IEnumerable

    Public days =
        New String() {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}

    Public Iterator Function GetEnumerator() As IEnumerator _
        Implements IEnumerable.GetEnumerator

        ' Yield each day of the week. 
        For i As Integer = 0 To days.Length - 1
            Yield days(i)
        Next 
    End Function 
End Class
Remove ads

問題

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

另見

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads