迭代器---Iterator
示例代码:将书(Book)放置到书架(BookShelf),并将书的名字按顺序显示。
Aggravate接口 :
目的:遍历的集合的接口。实现该接口的类可以保存多个元素,就像数组.
/**
* iterator接口是用于遍历集合的迭代器
* 想要遍历集合的元素可以调用iterator方法来生成一个实现iterator接口的实例
*/
public interface Aggregate {
public abstract Iterator iterator();
}
Iterator接口 :
/**
* 用于遍历集合中元素,类似循环变量
* 实现方法:1.hasNext 判断是否有下一元素
* 2.next方法 实际实现了两个功能 1)返回集合中的元素Object形式 2)迭代器移动到下一元素
* 具体的实现则需要通过实现了该接口的类 才知道next实际干的活
*/
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
Book类:
@Data
public class Book {
private String name;
public Book(String name){
this.name = name;
}
}
BookShelf类:
@Data
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);
}
}
注意这里实现了Iterator接口
BookShelfIterator类:
/**
* 该类需要发挥Iterator作用,因此实现了该类
* bookShelf为该类所要遍历的书架,index指当前迭代器的指向的书的下标
* index初始化=0
* 是否有下一本通过bookShelf.length()来比较
* next返回书是谁,并且让index指向下一本书
*/
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() {
if(index < bookShelf.getLength()){
return true;
}else {
return false;
}
}
@Override
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
Iterator模式中登场的角色:
Iterator(迭代器):
该角色负责定义按顺序逐个遍历元素的接口(API)。
ConcreteIterator(具体的迭代器):
该角色负责实现Iterator角色所定义的接口(API), 即BookShelfIterator类。包含遍历集合所必须的信息。
Aggregate(集合):
该角色负责创建Iterator角色的接口(API)。这个接口(API)是一个方法,回创建出“按顺序访问保存在我内部元素的人”。在示例程序中,由Aggregate接口扮演这个角色,它定义了Iterator方法。
ConcreteAggreate(具体的集合):
该角色负责实现Aggregate角色所定义的接口(API)。创建出具体的Iterator角色,即ConcreteIterator角色。示例中 BookShelf扮演该角色,实现了Interator方法。
使用Iterator的目的:
不管BookShelf如何变化,只要BookShelf的Iterator方法能正确返回实例,hasNext和next方法都能正常使用,不对while改变,仍然能用。
这能协助理解为什么在程序中Iterator方法的返回不是BookShelfIterator类,而是Iterator类,就是需要使用Iterator的方法进行变成,而不是BookShelfIterator的方法。