淺談Iterator迭代器模式

1、前言編程

設計模式有不少,最典型的是GoF的23種設計模式,聽起來不少,其實大部分咱們都是見過的,按照常見度來分,最經常使用的差很少是六七個吧,所以,咱們在學習的時候應該有輕重緩急之分,不能一視同仁,而應該抓住重點,將一些最經常使用的設計模式吃透了,那麼咱們在遇到一個實際問題的時候就能根據問題的須要來進行相應的取捨。學習是一個循環往復的過程,沒有學過一次再也不接觸就能掌握的,必定要反覆的記憶,反覆的練習,不斷地提煉,不斷地提升,沒有複習的學習就是參觀,沒有預習的學習就是作夢,沒有提高的學習就是浪費時間。設計模式

2、迭代器模式app

什麼叫作迭代器,咱們可能在C++的STL標準模板庫或者在Java中見過iterator這個東西,所謂「迭代」就是按照必定的次序或順序進行重複操做,這個操做能夠是遍歷也能夠是反覆的計算,而迭代器就是按照必定的順序對元素進行遍歷的過程。理解到這個程度,咱們可能很是的奇怪,由於咱們徹底可使用一個for循環來完成這樣的操做,又何須大費周章的來一個迭代器來遍歷呢?!這就涉及到軟件設計中最重要的一個原則了,那就是高內聚,低耦合。當咱們使用for循環來完成遍歷操做的時候代碼中有着大量的耦合,當咱們須要修改代碼的時候,不能作到少改甚至不改遍歷的代碼,而迭代器能夠作到,這爲代碼的可移植性、可擴展性等特性奠基了基礎。咱們能夠看到設計模式大多數是把簡單的問題給搞複雜了,可是這種複雜偏偏是爲了之後設計和擴展的簡單。正如沒有規劃的蓋一座房子,很快就蓋成了一座房子,但是由於沒有考慮到房子的方位、地基、之後的擴展、居住的溫馨,改出來的房子最後不能進行擴展而且不符協力學的美感和力感,最終只能從新拆掉重建,因此學習設計模式的時候最好看一些建築方面的設計,明白全局觀的重要性。廢話少說,直接上代碼(talk is cheap,let's show code!)ide

3、代碼函數

package designMode.iterator;

public class Book {
    String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package designMode.iterator;

public interface Aggregate {
    public abstract Iterator iterator();
}
package designMode.iterator;

public class BookShelf implements Aggregate{
    Book[] books;
    int pointer = 0;
    public BookShelf(int max_size){
        books = new Book[max_size];
    }
    public void appendBook(Book book){
        books[pointer] = book;
        pointer++;
    }

    public Book findBookAt(int index){
        return books[index];
    }

    public int getLength(){
        return pointer;
    }

    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}
package designMode.iterator;

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}
package designMode.iterator;

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

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

    @Override
    public boolean hasNext() {
        if(index<this.bookShelf.getLength()){
            return true;
        }
        return false;
    }

    @Override
    public Object next() {
        return bookShelf.findBookAt(index++);
    }
}
package designMode.iterator;

public class IteratorMain {
    public static void main(String[] args) {
        Book book1 = new Book("宮本武藏");
        Book book2 = new Book("孫悟空");
        Book book3 = new Book("諸葛亮");
        Book book4 = new Book("黃忠");
        Book book5 = new Book("蔡文姬");

        BookShelf bookShelf = new BookShelf(5);
        bookShelf.appendBook(book1);
        bookShelf.appendBook(book2);
        bookShelf.appendBook(book3);
        bookShelf.appendBook(book4);
        bookShelf.appendBook(book5);

        Iterator it = bookShelf.iterator();
        while (it.hasNext()){
            Book book = (Book) it.next();
            System.out.println("你選擇的英雄是:"+book.getName());
        }
    }
}

 

4、分析工具

在上面咱們的程序中,有着不少值得說明的地方,首先是類、接口的結構,咱們可使用下面的圖來表達,從圖中咱們能夠看出,最核心的兩個對象,一個是書架這樣的一個書的集合books[],表明了須要遍歷的元素;另外一個就是迭代器,好像一個工具,用到的時候將this對象代指的書架集合放裏面,進行遍歷,不須要的時候束之高閣。同時爲何會有接口呢,其實接口的做用是爲了下降耦合度,在main函數中,咱們使用的是iterator這個接口來定義的引用,而不是BookShelfIterator,這樣作的好處是徹底屏蔽了內部的細節,在用戶使用的時候,徹底不知道BookShelfIterator的存在。學習

引入迭代器後,能夠將元素的遍歷和實現分離開來,以下面的代碼中的while循環,沒有依賴與BookShelf的實現,沒有使用BookShelf的其它方法,只用了迭代器中hasNext和next方法。可複用指的是將一個類做爲一個組件,當一個組件發生變化時,不須要對其它組件進行修改或者只進行少許的修改就能夠實現修改後的功能。一樣的Iterator it = bookShelf.iterator();面向接口編程,便於程序的修改和維護。this

Iterator it = bookShelf.iterator();
while (it.hasNext()){
    Book book = (Book) it.next();
    System.out.println("你選擇的英雄是:"+book.getName());
}

5、總結spa

迭代器的種類很是多,咱們能夠根據遍歷的次序進行設計,來實現相應的功能。從該設計模式中咱們能夠看到接口的應用,面向接口編程的概念,以及元素的遍歷與實現分離,實現了高內聚低耦合。.net

 

淺談設計模式<最通俗易懂的講解>

相關文章
相關標籤/搜索