C 設計模式 迭代器模式

2021-09-26 13:46:09 字數 3104 閱讀 2954

迭代器模式-提供一種方法順序訪問乙個聚合物件中的各個元素,而又不暴露其內部的結構

每一種資料結構(包括自定義)遍歷自身內部的資料方式都是不同的。

但是我們又希望和常規的遍歷方式一樣呼叫,就如for和foreach一樣遍歷。

想要以相同的方式遍歷不同型別的聚合物件,首先就要有乙個相同的介面方法來統一獲取,我們可以自定義,也可以使用c#自帶的ienumerable。注意:只有繼承於ienumerable的介面才能使用foreach。否則只能使用for或者while來遍歷。

能夠遍歷乙個聚合物件的資料主要看2點,是否存在值,以及取出該值。那麼由此,就可以再次定義乙個介面實現上述的2點。我們仍然可以自定義或者採用c#自帶的ienumerator

定義乙個聚合類繼承於ienumerable,實現getenumerator()方法。定義乙個迭代器類繼承於ienumerator,在這個迭代器中實現真正迭代的邏輯。在getenumerator中返回這個迭代器。最後使用foreach去直接遍歷這個聚合類或者使用for或者while去處理ienumerator。

下面用**來說明:

先採用自定義的方式

1.根據上述說明,我們需要在聚合類中統一介面來獲取乙個統一的迭代器

定義迭代器介面

public inte***ce ianimaliterator

定義獲取方法介面

public inte***ce ianimal

2.定義聚合類,並繼承於ianimal

public class duck:ianimal

//實現介面

public ianimaliterator getanimals()

}

3.定義迭代器類,繼承迭代器介面

public class duckiterator:ianimaliterator

public bool hasnext()

public object next()

}

4.呼叫,遍歷duck中的name

duck duck = new duck();

var iterator = duck.getanimals();

while (iterator.hasnext())

5.新建乙個聚合類

public class duck:ianimal

public ianimaliterator getanimals()

}

6.為新建的chicken類新增乙個迭代器

public class chickeniterator:ianimaliterator

public bool hasnext()

public object next()

}

7.呼叫

chicken chicken = new chicken();

var chickeniterator = chicken.getanimals();

while (chickeniterator.hasnext())

和duck的呼叫也幾乎一樣,可封裝一下方法

8.

static void main(string args)

static void get(ianimaliterator iterator)

}

上面講了自定義迭代器,實際上c#已經實現了迭代器,就是ienumerable和ienumerator

下面將自定義的迭代器換成c#

1.聚合類

duck

public class duck:ienumerable

// public ianimaliterator getanimals()

//

public ienumerator getenumerator()

}

chicken

public class chicken:ienumerable

// public ianimaliterator getanimals()

//

public ienumerator getenumerator()

}

2.迭代器類

duckiterator

public class duckiterator:ienumerator

// public bool hasnext()

//

//// public object next()

//

public bool movenext()

public void reset()

public object current

}}

chickeniterator

public class chickeniterator:ienumerator

// public bool hasnext()

//

//// public object next()

//

public bool movenext()

public void reset()

public object current

}}

呼叫

class program

static void get(ienumerator iterator)

}}

當然,如果需要迭代的型別已經是迭代型別,我們直接返回這個這個型別的迭代器就可以了,不需要自己去實現乙個迭代器

public ienumerator getenumerator()

C 設計模式 迭代器模式

迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部表示。迭代器模式結構圖 iterator迭代器抽象類 class iterator public virtual object first 0 virtual object next 0 virtual ...

設計模式 C 迭代器模式

sejimoshi.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include include include using namespace std class student long getid intgetage void setname string name void...

C 設計模式 迭代器模式

迭代器模式 iterator 提供了一種順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部表示。因此,當你需要訪問乙個聚焦物件,而且不管這些物件是什麼都需要遍歷的時候,就應該選擇使用迭代器模式,為了遍歷不同的聚合結構提供了如開始,下乙個,是否結束,當前哪一項等統一的介面。迭代抽象類,用於定義得到...