Iterator Pattern迭代器模式迭代器模式:提供一種方法順序訪問一個彙總對象中各個元素,而又不暴露該對象的內部表示.
迭代器模式可以用來作為遍曆一個集合體。java 亦提供了一個工具類: java.util.Iterator<E> ,與其類似。
1.當你需要訪問一個聚集對象,而且不管這些對象是什麼都需要遍曆時,就應該考慮用迭代器模式。
2.當需要對聚集對象有多種遍曆方式時,可以考慮用迭代器模式。
3.迭代器模式在訪問數組,集合,列表等資料時,尤其是資料庫資料操作時,是非常普遍的應用,
所以各種進階語言 都對它進行了封裝,反而給人感覺此模式本身不太常用。
4.便於儲存遍曆狀態,對資料進行多個遍曆
情境需求
書架上有5本技術書籍,要求將書籍名稱一性遍曆出來,將顯示在Andriod 的 EditText 上面。以上面的需求為例,可以將具體需求具體到下面的:
Aggregate介面
Aggregate 介面是一個執行遞增的“彙總”。實現此介面的類就變成類似數組、集合的“彙總”。表示己彙總的介面。
Iterator介面
Iterator 介面執行元素遞增,具有類似迴圈變數的功能。表示執行遞增、遞減、遍曆的介面。
Book 類
Book 表示書籍,主要是為了擷取書的詳細。
BookShelf類
BookShelf 表示書架,此類實現Aggregate介面從而將其作為彙總處理。
BookShelfIterator類
BookShelfIterator表示掃描書架的類,實現了Iterator 的介面功能。
Main 類
用來顯示和測試上面編寫的代碼
-----------------------------------------
代碼實現: Aggregate介面(聚集抽象類別)
/**
* 抽象出要建立遍曆的介面方法
*/
public abstract interface Aggregate {
public abstract Iterator createDecIterator();
public abstract Iterator createIncIterator();
}
Iterator 介面(迭代器抽象類別)
public abstract class Iterator {
public abstract Object first();
public abstract boolean hasNext();
public abstract Object next();
public abstract Object currentItem();
}
Book 類
/**
* 表示 書籍的類
*
*/
public class Book {
private String name="";
public Book(String name){
this.name=name;
}
public String getName(){
return this.name;
}
}
BookShelf 類(聚集實作類別) import java.util.ArrayList;
import java.util.List;
public class BookShelf implements Aggregate {
private List<Object> mBookList;
public BookShelf() {
mBookList = new ArrayList<Object>();
}
@Override
public Iterator createDecIterator() {
return new BookShelfIteratorDec(this);
}
@Override
public Iterator createIncIterator() {
return new BookShelfIteratorInc(this);
}
public BookShelf addBook(Book book) {
mBookList.add(book);
return this;
}
public List<Object> getItems() {
return mBookList;
}
}
BookShelf實現了Aggregate 介面 ,該方法產生並返回createDecIterator,createIncIterator類的對象執行個體,即我們發一個命令說要對書架進行掃描時,就將得到的“彙總”返回出去。
BookShelfIteratorDec 類(實現迭代器類) public class BookShelfIteratorDec extends Iterator {
private BookShelf mBookShelf;
private int mCurrent;
public BookShelfIteratorDec(BookShelf bookShelf) {
this.mBookShelf = bookShelf;
this.mCurrent = bookShelf.getItems().size();
}
@Override
public Object first() {
return mBookShelf.getItems().get(mBookShelf.getItems().size() - 1);
}
@Override
public Object next() {// 得到聚集的下一個對象
Object ref = null;
mCurrent--;
if(mCurrent>=0){
ref = mBookShelf.getItems().get(mCurrent);
}
return ref;
}
@Override
public Object currentItem() {
return mBookShelf.getItems().get(mCurrent);
}
@Override
public boolean hasNext() {
return mCurrent < 1 ? false : true;
}
}
BookShelfIteratorInc 類(實現迭代器類)
public class BookShelfIteratorInc extends Iterator {private BookShelf mBookShelf;private int mCurrent;public BookShelfIteratorInc(BookShelf bookShelf) {this.mBookShelf = bookShelf;this.mCurrent = -1; }@Overridepublic Object first() {return mBookShelf.getItems().get(0);}@Overridepublic Object next() { Object ref = null; mCurrent++; if(mCurrent<mBookShelf.getItems().size()){ ref = mBookShelf.getItems().get(mCurrent); } return ref; }@Overridepublic Object currentItem() { return mBookShelf.getItems().get(mCurrent); }@Overridepublic boolean hasNext() { return mCurrent < mBookShelf.getItems().size() -1 ? true : false; }}
Main類
public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf();
bookShelf.addBook(new Book("Android"))
.addBook(new Book("WP"))
.addBook(new Book("IOS"));
Iterator decIterator = bookShelf.createDecIterator();
System.out.println("開始順序遍曆");
while(decIterator.hasNext()){
decIterator.next();
System.out.println("Book name is: " + ((Book)decIterator.currentItem()).getName());
}
Iterator incIterator = bookShelf.createIncIterator();
System.out.println("開始倒序遍曆");
while(incIterator.hasNext()){
incIterator.next();
System.out.println("Book name is: " + ((Book)incIterator.currentItem()).getName());
}
}
}
上面執行的結果:
開始順序遍曆
Book name is: IOS
Book name is: WP
Book name is: Android
開始倒序遍曆
Book name is: Android
Book name is: WP
Book name is: IOS
更多的功能擴充
上面講述了遞增和遞減的遍曆方式,也可自行添加其他遍曆方法,如:
- 由前往後、由後往前的雙向遍曆(Next 、Previous......)
- 指定一個下標立即得到
- 等等
參考連結:http://www.cnblogs.com/TerryBlog/archive/2011/07/05/2098666.html
http://clq9761.iteye.com/blog/1090186