設計模式一:叠代器(Iterator)模式
阿新 • • 發佈:2018-07-21
open 先來 strac alt rri print pre 並且 3-0
一、什麽是叠代器模式
說白了就是一種遍歷集合中元素的一種設計模式,我們趕緊先來看一下例子
二、實現舉例
這裏我們舉一個例子,是將書(Book)放置到書架中(BookShelf),一個叠代器,我們總共要寫2個接口,分別是一個集合接口(Agreegate),一個叠代器接口(Iterator),兩個接口對應的實現類,以及要被遍歷的對象對應的類
三、叠代器模式(Iterator)的實現步驟:
1.我們需要有一個集合接口,在這個接口裏面定義一個Iterator方法,用於生成遍歷集合的叠代器(Iterator)
1 package com.Maxwell07.IteratorMode.bookshelf;interface Aggregate2 3 /** 4 * 1.定義一個集合接口,用於生成遍歷集合的Iterator 5 */ 6 7 public interface Aggregate { 8 public abstract Iterator iterator(); 9 }
2.寫一個Iterator接口,Iterator接口包含hasNext和next的抽象方法
1 package com.Maxwell07.IteratorMode.bookshelf; 2 /** 3 * 2.寫一個Iterator接口,Iterator接口包含hasNext和next的抽象方法interface Iterator4 */ 5 6 public interface Iterator { 7 public abstract boolean hasNext(); 8 public abstract Object next(); 9 }
3.寫一個要被遍歷的類,這裏我們寫一個Book
package com.Maxwell07.IteratorMode.bookshelf; public class Book { private String name; public Book(String name) { thisclass Book.name = name; } public String getName() { return name; } }
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)模式