Java-設計模式-第一篇-迭代器模式

本人所學設計模式皆出自於 結城浩先生的《圖解設計模式》。

類圖:

    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集合來做容器。

注意:示例代碼類圖中接口方法我忘記標記爲抽象了哭

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章