1、模式說明設計模式
迭代操做在程序開發中很常見:在數據集合中按順序便利全部元素(例如:遍歷一個數組中的全部元素),將遍歷時使用的索引(如訪問數組循環變量i)抽象化、通用化後造成的模式就是迭代器模式。數組
核心的迭代器通常包含兩個方法:hasNext()和next()方法,前一個方法用於判斷集合中是否還存在下一個須要迭代的元素,返回值類型是Bool類型;next()方法用於返回集合中一個元素,而且將迭代器移動到下一個元素。app
該模式的UML圖和示例代碼UML圖以下:ide
迭代模式的UML很簡單,包含兩個接口:Aggregate接口和Iterator接口,對應ConcreteAggregate角色和ConcreteIterator角色。this
上圖中,設計兩個接口,而沒有隻使用一個Iterator接口,緣由在於咱們須要將「遍歷功能」獨立於ConcreteAggregate角色以外,這樣就能夠針對一個ConcreteAggregate角色編寫多種不一樣的ConcreteIterator角色(從前向後遍歷、從後向前遍歷previous、跳躍遍歷)。spa
2、模式中的角色:設計
3、模式代碼示例:code
(代碼分爲兩個包,patterndesign包用於設計模式的代碼實現,patterndemostrate用於模式代碼的使用實例說明)blog
代碼結構:索引
模式相關代碼:
Aggregrate接口:
package com.designpattern.cn.iteratorpattern.patterndesign; public interface Aggregate { public abstract Iterator iterator(); }
Iterator接口:
package com.designpattern.cn.iteratorpattern.patterndesign; public interface Iterator { public abstract boolean hasNext(); public abstract Object next(); }
模式實現演示:
Book書籍類:
package com.designpattern.cn.iteratorpattern.patterndemostrate; public class Book { private String name; public Book(String name){ this.name = name; } public String getName() { return name; } }
BookShelf書架類(相似模擬一個集合類):
package com.designpattern.cn.iteratorpattern.patterndemostrate; import com.designpattern.cn.iteratorpattern.patterndesign.Aggregate; import com.designpattern.cn.iteratorpattern.patterndesign.Iterator; public class BookShelf implements Aggregate { private Book books[]; private int last = 0; public BookShelf(int size){ this.books = new Book[size]; } public Book getBookAt(int index){ return books[index]; } public void appendBook(Book book){ this.books[last] = book; last++; } public int getLength(){ return last; } @Override public Iterator iterator() { return new BookShelfIterator(this); } }
迭代器類(實現了書架類(模擬集合)中元素的迭代):
package com.designpattern.cn.iteratorpattern.patterndemostrate; import com.designpattern.cn.iteratorpattern.patterndesign.Iterator; public class BookShelfIterator implements Iterator { private BookShelf bookShelf; private int index; public BookShelfIterator(BookShelf bookShelf){ this.bookShelf = bookShelf; this.index = 0; } public boolean hasNext(){ return index < bookShelf.getLength(); } public Object next(){ Book book = bookShelf.getBookAt(index); index++; return book; } }
運行結果:
4、相關的模式
此隨筆參照中國工信出版集團,人民郵電出版社的《圖解設計模式》梳理。