迭代器模式-提供一種方法順序訪問乙個聚合物件中的各個元素,而又不暴露其內部的結構
每一種資料結構(包括自定義)遍歷自身內部的資料方式都是不同的。
但是我們又希望和常規的遍歷方式一樣呼叫,就如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 提供了一種順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部表示。因此,當你需要訪問乙個聚焦物件,而且不管這些物件是什麼都需要遍歷的時候,就應該選擇使用迭代器模式,為了遍歷不同的聚合結構提供了如開始,下乙個,是否結束,當前哪一項等統一的介面。迭代抽象類,用於定義得到...