遍歷聚合物件中的元素——迭代器模式(四)
4 使用內部類實現迭代器
在迭代器模式結構圖中,我們可以看到具體迭代器類和具體聚合類之間存在雙重關係,其中一個關係為關聯關係,在具體迭代器中需要維持一個對具體聚合物件的引用,該關聯關係的目的是訪問儲存在聚合物件中的資料,以便迭代器能夠對這些資料進行遍歷操作。
除了使用關聯關係外,為了能夠讓迭代器可以訪問到聚合物件中的資料,我們還可以將迭代器類設計為聚合類的內部類,JDK中的迭代器類就是通過這種方法來實現的,如下AbstractList類程式碼片段所示:
package java.util;
……
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
......
private class Itr implements Iterator<E> {
int cursor = 0;
......
}
……
}
我們可以通過類似的方法來設計第3節中的ProductList類,將ProductIterator類作為ProductList類的內部類,程式碼如下所示:
//商品資料類:具體聚合類
class ProductList extends AbstractObjectList {
public ProductList(List products) {
super(products);
}
public AbstractIterator createIterator() {
return new ProductIterator();
}
//商品迭代器:具體迭代器,內部類實現
private class ProductIterator implements AbstractIterator {
private int cursor1;
private int cursor2;
public ProductIterator() {
cursor1 = 0;
cursor2 = objects.size() -1;
}
public void next() {
if(cursor1 < objects.size()) {
cursor1++;
}
}
public boolean isLast() {
return (cursor1 == objects.size());
}
public void previous() {
if(cursor2 > -1) {
cursor2--;
}
}
public boolean isFirst() {
return (cursor2 == -1);
}
public Object getNextItem() {
return objects.get(cursor1);
}
public Object getPreviousItem() {
return objects.get(cursor2);
}
}
}
無論使用哪種實現機制,客戶端程式碼都是一樣的,也就是說客戶端無須關心具體迭代器物件的建立細節,只需通過呼叫工廠方法createIterator()即可得到一個可用的迭代器物件,這也是使用工廠方法模式的好處,通過工廠來封裝物件的建立過程,簡化了客戶端的呼叫。
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 遍歷聚合物件中的元素——迭代器模式(三)物件模式
- 設計模式系列之迭代器模式(Iterator Pattern)——遍歷聚合物件中的元素設計模式物件
- Java遍歷Map物件的四種方式Java物件
- 讓Vue的v-for支援迭代器遍歷Vue
- 如何遍歷Map中的物件物件
- DOM元素的遍歷
- 關於二叉樹的前序遍歷、中序遍歷、刪除元素、插入元素二叉樹
- for in語句遍歷陣列中的元素陣列
- js如何遍歷陣列中的元素JS陣列
- C++11::遍歷tuple中的元素C++
- 不用for迭代 --手工訪問迭代器中的元素.
- jQuery 元素操作——遍歷元素jQuery
- Jvascript陣列迭代,遍歷的方法陣列
- 94. 二叉樹的中序遍歷(迭代)二叉樹
- JS 物件的遍歷JS物件
- JS中遍歷陣列、物件的方式JS陣列物件
- Jquery之遍歷元素jQuery
- JavaScript 遍歷、列舉與迭代JavaScript
- 【Java中遍歷Map物件的4種方法】Java物件
- JS遍歷物件的方式JS物件
- 深入JS物件的遍歷JS物件
- vector容器1(新增元素,遍歷元素)
- javascript如何遍歷陣列中的每一個元素JavaScript陣列
- 你知道JavaScript中的可迭代物件與迭代器嗎JavaScript物件
- 二叉樹的遍歷 (迭代法)二叉樹
- Java中如何遍歷Map物件的4種方法Java物件
- jquery遍歷子元素的寫法jQuery
- vue遍歷map物件Vue物件
- thymeleaf模板 遍歷物件物件
- Qt遍歷子物件QT物件
- 遍歷陣列物件陣列物件
- JavaScript遍歷物件的屬性JavaScript物件
- 常見物件-字串的遍歷物件字串
- 物件和陣列的遍歷物件陣列
- 為什麼for迴圈可以遍歷list:Python中迭代器與生成器Python
- 遍歷List 同時 remove 元素REM
- JS中陣列與物件的遍歷方法例項JS陣列物件
- 如何遍歷物件直接量中的各個屬性物件