为什么要用iterator模式?
我们在遍历集合的时候,希望复用同一段代码来实现对于不同集合的遍历,而不是对于不同的集合都要单独编写各自的遍历代码;
具体看下面的代码:
代码1:BookShelfIterator.java
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index;
public Book next() {
Book book=bookShelf.getBookAt(index);
index++;
return book ;
}
public boolean hasNext() {
if(bookShelf.getLength()>index) {
return true;
}else {
return false;
}
}
public BookShelfIterator(BookShelf bookShelf, int index) {
super();
this.bookShelf = bookShelf;
this.index = index;
}
}
代码2:BookShelf.java
import java.util.ArrayList;
public class BookShelf implements Aggregate {
private ArrayList<Book> books;
public Iterator iterator() {
Iterator iterator=new BookShelfIterator(this,0);//this妙,多态也妙
return iterator;
}
public Book getBookAt(int index) {
return books.get(index);
}
public void appendBook(Book book) {
books.add(book);
}
public int getLength() {
return books.size();
}
public BookShelf() {
super();
books=new ArrayList();//防止空指针异常
}
}
我的理解是这样的:
- BookShelf对应的是集合,内容是可以随着集合的类型变化;
- BookShelfIterator对应的是迭代器,我们希望这部分内容可以复用;
- 当集合类型发生变化时,我们只需要修改BookShelf中的getBookAt等成员方法即可;
- 而BookShelfIterator中的内容我们可以直接复用;
- 这就相当于解耦;
剩余代码如下:
代码3:Aggregate.java
public interface Aggregate {
public abstract Iterator iterator();
}
代码4:Iterator.java
public interface Iterator {
public abstract Object next();//Object妙
public abstract boolean hasNext();
}
代码5:Book.java
public class Book {
private String name;
public String getName() {
return name;
}
public Book(String name) {
this.name=name;
}
@Override
public String toString() {
return "Book [name=" + name + "]";
}
}
代码6:Main.java
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Book book1=new Book("邪神传说");
Book book2=new Book("龙王传说");
Book book3=new Book("影子传说");
Book book4=new Book("哥是传说");
BookShelf bookshelf=new BookShelf();
bookshelf.appendBook(book1);
bookshelf.appendBook(book2);
bookshelf.appendBook(book3);
bookshelf.appendBook(book4);
Iterator iterator=bookshelf.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
运行结果1:
Book [name=邪神传说]
Book [name=龙王传说]
Book [name=影子传说]
Book [name=哥是传说]
1.修改Main.java的遍历程序为:
while(iterator.hasNext()) {
Book book=(Book) iterator.next();
System.out.println(book.getName());
}
运行结果2:
邪神传说
龙王传说
影子传说
哥是传说
2.修改Main.java的遍历程序为:
while(iterator.hasNext()) {
System.out.println(iterator.next().getClass());
}
运行结果3:
class Book
class Book
class Book
class Book
3.修改Main.java的遍历程序为:
while(iterator.hasNext()) {
System.out.println((iterator.next().getName());
}
这样编译无法通过
根据2和3的矛盾我觉得这应该是运行时类型和编译时类型的问题吧
即iterator.next()的运行时类型是Book
但是编译时类型不是
(getClass()返回的就是运行时类型)