1. 程式人生 > >設計模式一:叠代器(Iterator)模式

設計模式一:叠代器(Iterator)模式

open 先來 strac alt rri print pre 並且 3-0

一、什麽是叠代器模式

  說白了就是一種遍歷集合中元素的一種設計模式,我們趕緊先來看一下例子

二、實現舉例

  這裏我們舉一個例子,是將書(Book)放置到書架中(BookShelf),一個叠代器,我們總共要寫2個接口,分別是一個集合接口(Agreegate),一個叠代器接口(Iterator),兩個接口對應的實現類,以及要被遍歷的對象對應的類

三、叠代器模式(Iterator)的實現步驟:

1.我們需要有一個集合接口,在這個接口裏面定義一個Iterator方法,用於生成遍歷集合的叠代器(Iterator)

技術分享圖片
1 package com.Maxwell07.IteratorMode.bookshelf;
2 3 /** 4 * 1.定義一個集合接口,用於生成遍歷集合的Iterator 5 */ 6 7 public interface Aggregate { 8 public abstract Iterator iterator(); 9 }
interface Aggregate

2.寫一個Iterator接口,Iterator接口包含hasNext和next的抽象方法

技術分享圖片
1 package com.Maxwell07.IteratorMode.bookshelf;
2 /**
3  * 2.寫一個Iterator接口,Iterator接口包含hasNext和next的抽象方法
4 */ 5 6 public interface Iterator { 7 public abstract boolean hasNext(); 8 public abstract Object next(); 9 }
interface Iterator

3.寫一個要被遍歷的類,這裏我們寫一個Book

技術分享圖片
package com.Maxwell07.IteratorMode.bookshelf;

public class Book {
    private String name;

    public Book(String name) {
        this
.name = name; } public String getName() { return name; } }
class Book

4.寫一個集合的實現類,這裏我們寫一個實現了Aggreegate接口的BookShelf,它可以看做是Book的一個集合類

技術分享圖片
 1 package com.Maxwell07.IteratorMode.bookshelf;
 2 
 3 public class BookShelf implements Aggregate {
 4     private Book[] books;
 5     private int last = 0;
 6 
 7     public BookShelf(int maxSize){
 8         this.books = new Book[maxSize];
 9     }
10     public Book getBookAt(int index){
11         return books[index];
12     }
13 
14     public void appendBook(Book book){
15         this.books[last] =book;
16         last++;
17     }
18 
19     public int getLength(){
20         return last;
21     }
22     //實現接口中的叠代器
23     @Override
24     public Iterator iterator() {
25         return new BookShelfIterator(this);
26     }
27 }
class BookShelf implements Aggregate

5.最後我們再寫一個Iterator接口的實現類,也就是集合的叠代器,在這裏我們把它命名為BookShelfIterator

技術分享圖片
package com.Maxwell07.IteratorMode.bookshelf;

public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    //判斷如果當前的index小於數組的長度,則返回true,否則返回false
    @Override
    public boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }
    //返回當前索引對應的對象
    @Override
    public Object next() {
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}

6.我們驗證一下叠代器

package com.Maxwell07.IteratorMode.bookshelf;

public class Main {
    public static void main(String[] args){
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("三國演義"));
        bookShelf.appendBook(new Book("水滸傳"));
        bookShelf.appendBook(new Book("西遊記"));
        bookShelf.appendBook(new Book("紅樓夢"));
        Iterator iterator = new BookShelfIterator(bookShelf);
        while (iterator.hasNext()) {
            Book book = (Book) iterator.next();
            System.out.println("書架上有一本:"+book.getName());
        }
    }
}
測試類

  文中的代碼鏈接:https://github.com/Maxwell07/DesignMode/tree/master/src/com/Maxwell07/IteratorMode/bookshelf

四、為什麽我們要用叠代器模式?

為了遍歷集合,我們引入了一種這麽復雜的設計模式,並且在寫的時候容易出錯,但是我們仔細想一下,引入叠代器以後,實際上我們把實現和遍歷分開了,遍歷並不會再依賴於實現。正如上面的例子,我們把數組換成集合,main函數中遍歷的代買還是不需要再做修改

五、源碼中的叠代器模式

//todo 待更新

設計模式一:叠代器(Iterator)模式