本人所學設計模式皆出自於 結城浩先生的《圖解設計模式》。
類圖:
Iterator類圖
示例代碼類圖
爲什使用Iterator模式
如果編寫BookShelf的開發人員決定放棄用數組來管理書本,而是使用Vector來管理,不管BookShelf如何變化,只要BookShelf的iterator方法能夠返回Iterator的實例,那麼對於程序的調用者來說,並不用擔心調用方式會發生變化,不改變調用方法,一樣可以使程序繼續工作。
舉例代碼
package com.qiang.iterator;
/**
* 表示集合的接口
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public interface Aggregate {
/**
* 創建遍歷集合的接口
*
* @return 遍歷集合的接口
*/
Iterator iterator();
}
package com.qiang.iterator;
/**
* 遍歷集合的接口
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public interface Iterator {
/**
* 是否還有下一個
*
* @return 是、否
*/
boolean hasNext();
/**
* 下一個遍歷結果
*
* @return 下一個
*/
Object next();
}
package com.qiang;
import com.qiang.iterator.Aggregate;
import com.qiang.iterator.Iterator;
import com.qiang.model.Book;
/**
* 書架
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class BookShelf implements Aggregate {
private Book[] books;
private int last = 0;
public BookShelf(int maxSize) {
this.books = new Book[maxSize];
}
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.qiang.model;
/**
* 書籍
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.qiang;
import com.qiang.iterator.Iterator;
import com.qiang.model.Book;
/**
* 書架迭代遍歷
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
@Override
public boolean hasNext() {
return index < bookShelf.getLength();
}
@Override
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
package com.qiang;
import com.qiang.iterator.Iterator;
import com.qiang.model.Book;
/**
* 測試方法
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Test {
public static void main(String[] args) {
//能裝5本書的書架
BookShelf bookShelf = new BookShelf(7);
//放4本書
bookShelf.appendBook(new Book("Think In Java"));
bookShelf.appendBook(new Book("Design Patterns"));
bookShelf.appendBook(new Book("Understanding the JVM"));
bookShelf.appendBook(new Book("Effective Java"));
Iterator iterator = bookShelf.iterator();
while (iterator.hasNext()) {
Book book = (Book) iterator.next();
System.out.println(book.getName());
}
}
}
由於書架中管理書籍的是數組,會造成書的數量超過指定書架容量,無法繼續添加書籍,所以建議使用List集合來做容器。
注意:示例代碼類圖中接口方法我忘記標記爲抽象了