1. 程式人生 > 其它 >23種設計模式 —— 手寫實現 Iterator模式

23種設計模式 —— 手寫實現 Iterator模式

技術標籤:java學習設計模式java

文章目錄


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());
        }
    }
}

執行效果
在這裡插入圖片描述