迭代器模式的类图
类图的解释
名称 | 说明 |
---|---|
Aggregate | 集合接口,有提供迭代器的方法 |
Iterator | 迭代器接口,提供迭代操作 |
BookShelf | 书架类 |
Book | 书类 |
BookShelfIterator | 书架类的迭代器 |
迭代器模式的代码
//集合接口
public interface Aggregate {
//生成迭代器的方法
public abstract Iterator iterator();
}
//迭代器接口
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
//书架类
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 this.books[index];
}
public void appendBook(Book book) {
this.books[last] = book;
last++;
}
public int getLength() {
return last;
}
//获得BookShelf迭代器
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
//书类
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//书架迭代器类
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
public boolean hasNext() {
if (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
}
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
//测试方法
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 = bookShelf.iterator();
while (iterator.hasNext()) {
Book book = (Book)iterator.next();
System.out.println(book.getName());
}
}
解释
-
BookShelf相当于一个Book的集合,Aggregate接口相当于“集合操纵工具”的工具箱,BookShelf实现了Aggregate接口,就可以从工具箱里面取出集合操纵工具。
-
Iterator是集合的遍历工具,BookShelfIterator实现Iterator接口,就拥有了遍历集合的能力,经过特殊化修改,成为专门遍历BookShelf的工具。
-
这样,我们就可以从BookShelf中取得Book集合遍历工具BookShelfIterator,使用它遍历这个BookShelf了。
原因
-
既然是遍历一个集合,直接写一个for循环不就行了,为什么要搞这么麻烦?
-
因为:集合可以是一个数组,也可以是一个Vector,还可以是一个list,每种的遍历方式都不一样。如果要把数组换成list来用,那么整套代码都得重写。而用了迭代器模式后,只需要改变具体的迭代方法的实现即可。
思想
-
将通用的方法与具体的实现分离。
-
弱化类之间的耦合,使类作为组件更容易被复用。
-
尽量避免用具体的类来编程,优先使用抽象类和接口。
-
说白了,写代码不要写的太具体,要抽象些...改着也好改。