1. 程式人生 > >圖解設計模式之Iterator模式

圖解設計模式之Iterator模式

strong ack [] 示例 AI pac method gre etl

一:什麽是Iterator模式?

將循環變量i的作用抽象化,通用化形成的模式,在設計模式中稱為Iterator模式(叠代器模式),該模式用於在數據集合中按照順序遍歷集合

二:為什麽要有Iterator模式?

為了回答這個問題,我們先看示例程序:
?1.?示例程序的類圖
技術分享圖片
?2.?類和接口的示意圖
技術分享圖片
?3.?示例程序
??>1.?Aggregate接口

package com.zgz.dm.Iterator;
/**
 * 表示集合的接口
 * @author guozhenZhao
 * @date 2018年6月12日
 */
public interface Aggregate {
    //該方法生成一個用於遍歷集合的叠代器
    public abstract Iterator iterator();
}

??>2.?Iterator接口

package com.zgz.dm.Iterator;
/**
 * 該接口用於遍歷集合中的元素
 * @author guozhenZhao
 * @date 2018年6月12日
 */
public interface Iterator {
    //判斷集合中是否存在下一個元素
    public abstract boolean hasNext();
    //獲取集合中的下一個元素
    public abstract Object next();
}

??>3.?Book類

package com.zgz.dm.Iterator;
/**
 * 表示書這個類
 * @author guozhenZhao
 * @date 2018年6月12日
 */
public class Book {
    private String name;

    public String getName() {
        return name;
    }

    public Book(String name) {
        super();
        this.name = name;
    }

}

??>4.?BookShelf類

package com.zgz.dm.Iterator;
/** 
 * 表示書架的類
 * @author guozhenZhao
 * @date 2018年6月12日
 */

import java.util.ArrayList;
import java.util.List;

public class BookShelf implements Aggregate {
    //private Book[] books;
    //private int last = 0;
    private List<Book> books;

    public BookShelf() {
        super();
        this.books = new ArrayList<Book>();
    }

    //獲取書架中對應的書
    public Book getBookAt(int index) {
        //return books[index];
        return books.get(index);
    }

    //向書架中添加書
    public void appendBook(Book book) {
        //this.books[last] = book;
        //last++;
        this.books.add(book);
    }

    //獲取書架的長度
    public int getLength() {
        //return last;
        return books.size();
    }

    //遍歷書架中的書
    @Override
    public Iterator iterator() {
        // TODO Auto-generated method stub
        return new BookShelfIterator(this);
    }

}

??>5.?BookShelfIterator類

package com.zgz.dm.Iterator;
/**
 * 遍歷書架的類
 * @author guozhenZhao
 * @date 2018年6月12日
 */
public class BookShelfIterator implements Iterator{

    private BookShelf bookShelf;
    private int index;

    public BookShelfIterator(BookShelf bookShelf) {
        super();
        this.bookShelf = bookShelf;
        this.index = 0;
    }

    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub
        if (index < bookShelf.getLength()) {
            return true;
        }else {
            return false;
        }
    }

    @Override
    public Object next() {
        // TODO Auto-generated method stub
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }

}

??>6.?測試類

package com.zgz.dm.Iterator;
/**
 * 測試類
 * @author guozhenZhao
 * @date 2018年6月12日
 */
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BookShelf bookShelf = new BookShelf();
        bookShelf.appendBook(new Book("追風箏的人"));
        bookShelf.appendBook(new Book("java編程思想"));
        bookShelf.appendBook(new Book("SSM整合"));
        bookShelf.appendBook(new Book("平凡的世界"));
        bookShelf.appendBook(new Book("springBoot"));

        Iterator it = bookShelf.iterator();
        while(it.hasNext()) {
            Book book = (Book)it.next();
            System.out.println(book.getName());
        }
    }

}

 讀完示例程序,回答上面的問題,為什麽要有Iterator模式呢?如果是數組的話直接使用for循環遍歷不就得了。在上面的程序中有一個BookShelf類,其中一個方法,如下圖:
技術分享圖片
在這個方法中返回的是Iterator並不是對應的對象類,在測試類中遍歷的時候,如下圖:
技術分享圖片
上面的代碼調用的是Iterator的hasNext()方法和next方法,此時的while循環不依賴BookShelf類的實現。所以引入Iterator後可以將遍歷和實現分離開。設計模式的作用就是幫助我們編寫可以復用的類,所謂的可復用就是將類實現為一個組件,在需要變動時,便於修改,所以也就不難理解為啥上圖代碼返回的是Iterator類型了。學習設計模式,其思想在於:
  不要只使用具體類編程,優先使用抽象類和借口來編程

圖解設計模式之Iterator模式