参考:1.《图解设计模式》
Iterator模式适用于数据集合中按照顺序遍历集合
为什么在遍历的时候要额外引入迭代器这种复杂的模式呢?
引入迭代器设计模式的一个重要理由是:将实现和遍历进行了分离,也就是说遍历的过程完全不依赖与你所选择的集合是如何实现的 , 如果开发者换了其他的容器来承载数据,那么只需要修改集合的实现方式即可,完全不需要去修改遍历的过程代码,这就提高了代码的“可复用性”和“可靠性”。
JDK里的Iterator设计模式


可以看到他们都实现了Iterable接口,Iterable接口的代码如下
/*** Implementing this interface allows an object to be the target of* the "for-each loop" statement.*/public interface Iterable<T> {/*** Returns an iterator over elements of type {@code T}.** @return an Iterator.*/Iterator<T>Iterator<T> iterator();default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}default Spliterator<T> spliterator() {return Spliterators.spliteratorUnknownSize(iterator(), 0);}}
正如JDK注释里说的, 实现iterable接口的类可以使用“foreach”操作,然后并要求实现Iterator
ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("a");Iterator iterator = arrayList.iterator();
代码示例
UML类图如下
/*** 要遍历的集合的接口,实现该接口的类将成为可以保存多个元素的集合*/public interface Aggregate {public abstract Iterator iterator();}
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 ;}@Overridepublic Iterator iterator() {return new BookShelfIterator(this);}}
/*** 用于遍历书架集合里的书*/public class BookShelfIterator implements Iterator {private BookShelf bookShelf ;private int index ;public BookShelfIterator(BookShelf bookShelf) {this.bookShelf = bookShelf ;this.index = 0 ;}@Overridepublic boolean hasNext() {if (index < bookShelf.getLength()) {return true;} else {return false;}}@Overridepublic Object next() {Book book = bookShelf.getBookAt(index) ;index ++;return book;}}
public class Book {private String name ;public Book (String name) {this.name = name ;}public String getName() {return name;}}
/***测试代码*/public class Main {public static void main(String[] args) {BookShelf bookShelf = new BookShelf(5);bookShelf.appendBook(new Book("图解设计模式"));bookShelf.appendBook(new Book("Java编程思想"));bookShelf.appendBook(new Book("算法"));bookShelf.appendBook(new Book("TCP/IP协议:卷1"));Iterator iterator = bookShelf.iterator();while (iterator.hasNext()) {Book book = (Book) iterator.next();System.out.println(book.getName());}}}
核心代码主要是BookShelfIterator类实现Iterator接口并重写hasNext()和next()方法:hasNext()方法用于检测集合遍历的边界条件,而next()方法则像是遍历指针。
