23種設計模式 —— 手寫實現 Iterator模式
阿新 • • 發佈:2021-01-15
文章目錄
Author:Gorit
Date:2020/12/1
Refer:《圖解設計模式》
2021年發表博文: 1/50
一、Iterator 模式的來源
1.1 Iterator 由來
這是我們常見的迴圈遍歷的方式
int[] arr = new int[199];
for (int i=0;i<arr.length;i++) {
...
}
這裡的迴圈變數 i 的作用抽象化,通用化後形成的模式,在設計模式中稱為 Iterator
模式
用於在資料集合中按照順序遍歷集合,iterator 有反覆做某件事的意思,因此稱為“迭代器”,所以稱為 迭代器模式
1.2 實現 Iterator
我們將實現 一個將書 (Book) 放入書架(BookShelf),並將書的名字按順序顯示出來,因此需要用到如下模組
類(介面) | 功能 |
---|---|
Aggregate 介面 | 所要遍歷的集合的介面,實現該介面的類將成為一個可以多個元素的集合,就像陣列一樣 |
Iterator 介面 | 遍歷集合的介面 |
Book 類 | 表示書的類 |
BookShelf 類 | 表示書架的類 |
BookShelfIterator | 遍歷書架的類 |
Main | 測試 |
Aggregate 介面
package Iterator;
public interface Aggregate {
// 該方法會生成一個用於遍歷集合的迭代器,當需要遍歷集合的元素時,可以呼叫該方法
public abstract Iterator iterator();
}
Iterator 介面
package Iterator;
/**
* 用於遍歷集合中的元素,相當於迴圈中的迴圈變數
* 以下實現了一個最簡單的 Iterator 介面
*/
public interface Iterator {
public abstract boolean hasNext(); // 是否有下一個元素
public abstract Object next(); // 下一個元素的值
}
Book 類
package Iterator;
/**
* 書籍的最小實體
*/
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
BookShelf 類
package Iterator;
/**
* 表示書架的類,改類需要作為集合儲存 所有的書籍,因此需要實現 Aggregate 介面
*/
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;
}
// ps 當外部想要遍歷書架時,就會呼叫這個方法:
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
BookShelfIterator 類
package Iterator;
/**
* 用於遍歷書架的 BookShelfIterator 類
* 該介面要發揮 Iterator 的作用,因此要實現 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() {
if (index < bookShelf.getLength()) {
return true;
}
return false;
}
public Object next() {
Book book = bookShelf.getBookAt(index++);
return book;
}
}
Main
package Iterator;
public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(4);
bookShelf.appendBook(new Book("A"));
bookShelf.appendBook(new Book("B"));
bookShelf.appendBook(new Book("C"));
bookShelf.appendBook(new Book("D"));
Iterator it = bookShelf.iterator();
while (it.hasNext()) {
Book book = (Book) it.next();
System.out.println(book.getName());
}
}
}
執行效果