迭代器模式
我們在日常的開發(fā)中,特別是在使用集合的過程中都或多或少使用了迭代器來對集合進行遍歷。這時候我們就會思考一個問題,明明簡單的For循環(huán)就能解決的集合遍歷問題,我們非得創(chuàng)造一個迭代器來進行集合的遍歷,使用迭代器來遍歷到底有什么不一樣的地方嗎?本著‘存在即合理’的原則,我們通過手寫迭代器的方式來深入了解一下迭代器模式的實現(xiàn)和帶來的編碼好處。
實現(xiàn)案例
有一個書架,我們想要知道這個書架里面堆了哪些書籍,這時候我們就需要對書架里面的書一本一本的遍歷,直到沒有書本,我們就能清楚的知道數(shù)據(jù)上堆滿了哪些書籍。
- 可以被遍歷的標記(生成迭代器的接口)
首先提供一個接口,來標明這個類是可以被遍歷的集合。實現(xiàn)這個接口的類可以生成對應的迭代器。
public interface Aggregate{
public abstract Iterator iterator();
}
- 迭代器接口
迭代器的抽象接口,定義了兩個方法
(1)是否還有下一個元素
(2)返回下一個元素
public interface Iterator{
public abstract boolean hasNext();
public abstract Object next();
}
- 集合存儲的元素(書本)
public class book{
private String name;
}
- 迭代器實現(xiàn)類
public class BookShelfIterator{
private BookShelf bookShelf;
//指向當前遍歷的位置
private int index;
...
public boolean hasNext(){
//將當前的index與集合的大小做比較,小于集合大小,說明還有元素。
if(index < bookShelf.length){
return true;
}else{
return false;
}
}
public Object next(){
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
- 書架類
書架類用于存放書本,可以用來遍歷,因此需要實現(xiàn)Aggregate接口
public class BookShelf implements Aggregate{
...
public Iterator iterator(){
//生成對應的迭代器
return new BookShelfIterator();
}
}
- 測試方法
Iterator it = bookShelf.iterator();
while(it.hasNext){
Book book = (Book)it.next();
}
由此,我們就自定義實現(xiàn)了一個迭代器,可以滿足集合遍歷的基本需求
迭代器模式的幾點思考
為什么要使用迭代模式
遍歷與實現(xiàn)分開,無論BookShelf是怎樣的實現(xiàn),只要能夠獲取到對應的迭代器,遍歷方式都是不會變的,利于代碼的擴展。
Iterator it = bookShelf.iterator();
while(it.hasNext){
Book book = (Book)it.next();
}
多種迭代器
迭代器實現(xiàn)了遍歷集合的方式,那么我們可以設計多種不一樣的迭代器。
- 從后向前遍歷
- 跳躍性遍歷